MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。

  1. SELECT * FROM vu_emp1;
  2. SELECT employee_id,last_name,salary
  3. FROM emps;
  4. #更新视图的数据,会导致基表中数据的修改
  5. UPDATE vu_emp1
  6. SET salary = 20000
  7. WHERE employee_id = 101;
  8. #同理,更新表中的数据,也会导致视图中的数据的修改
  9. UPDATE emps
  10. SET salary = 10000
  11. WHERE employee_id = 101;
  12. #删除视图中的数据,也会导致表中的数据的删除
  13. DELETE FROM vu_emp1
  14. WHERE employee_id = 101;
  15. SELECT employee_id,last_name,salary
  16. FROM emps
  17. WHERE employee_id = 101;

视图数据无法更新的情况

  1. SELECT * FROM vu_emp_sal;
  2. # 更新失败
  3. # 通过聚合函数算出来的结果
  4. UPDATE vu_emp_sal
  5. SET avg_sal = 5000
  6. WHERE department_id = 30;
  7. #删除失败
  8. DELETE FROM vu_emp_sal
  9. WHERE department_id = 30;

要使视图可更新,视图中的行和底层基本表中的行之间必须存在**一对一**的关系。另外当视图定义出现如下情况时,视图不支持更新操作:

  • 在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作;
  • 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
  • 在定义视图的SELECT语句中使用了JOIN联合查询,视图将不支持INSERT和DELETE操作;
  • 在定义视图的SELECT语句后的字段列表中使用了数学表达式子查询,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值;
  • 在定义视图的SELECT语句后的字段列表中使用DISTINCT聚合函数GROUP BYHAVINGUNION等,视图将不支持INSERT、UPDATE、DELETE;
  • 在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持INSERT、UPDATE、DELETE;
  • 视图定义基于一个不可更新视图
  • 常量视图。