MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。
SELECT * FROM vu_emp1;SELECT employee_id,last_name,salaryFROM emps;#更新视图的数据,会导致基表中数据的修改UPDATE vu_emp1SET salary = 20000WHERE employee_id = 101;#同理,更新表中的数据,也会导致视图中的数据的修改UPDATE empsSET salary = 10000WHERE employee_id = 101;#删除视图中的数据,也会导致表中的数据的删除DELETE FROM vu_emp1WHERE employee_id = 101;SELECT employee_id,last_name,salaryFROM empsWHERE employee_id = 101;
视图数据无法更新的情况
SELECT * FROM vu_emp_sal;# 更新失败# 通过聚合函数算出来的结果UPDATE vu_emp_salSET avg_sal = 5000WHERE department_id = 30;#删除失败DELETE FROM vu_emp_salWHERE department_id = 30;
要使视图可更新,视图中的行和底层基本表中的行之间必须存在**一对一**的关系。另外当视图定义出现如下情况时,视图不支持更新操作:
- 在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作;
- 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
- 在定义视图的SELECT语句中使用了
JOIN联合查询,视图将不支持INSERT和DELETE操作; - 在定义视图的SELECT语句后的字段列表中使用了
数学表达式或子查询,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值; - 在定义视图的SELECT语句后的字段列表中使用
DISTINCT、聚合函数、GROUP BY、HAVING、UNION等,视图将不支持INSERT、UPDATE、DELETE; - 在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持INSERT、UPDATE、DELETE;
- 视图定义基于一个
不可更新视图; - 常量视图。
