5.1 一般情况
MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。
举例:UPDATE操作
mysql> SELECT ename,tel FROM emp_tel WHERE ename = '孙洪亮';+---------+-------------+| ename | tel |+---------+-------------+| 孙洪亮 | 13789098765 |+---------+-------------+1 row in set (0.01 sec)mysql> UPDATE emp_tel SET tel = '13789091234' WHERE ename = '孙洪亮';Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT ename,tel FROM emp_tel WHERE ename = '孙洪亮';+---------+-------------+| ename | tel |+---------+-------------+| 孙洪亮 | 13789091234 |+---------+-------------+1 row in set (0.00 sec)mysql> SELECT ename,tel FROM t_employee WHERE ename = '孙洪亮';+---------+-------------+| ename | tel |+---------+-------------+| 孙洪亮 | 13789091234 |+---------+-------------+1 row in set (0.00 sec)
举例:DELETE操作
mysql> SELECT ename,tel FROM emp_tel WHERE ename = '孙洪亮';+---------+-------------+| ename | tel |+---------+-------------+| 孙洪亮 | 13789091234 |+---------+-------------+1 row in set (0.00 sec)mysql> DELETE FROM emp_tel WHERE ename = '孙洪亮';Query OK, 1 row affected (0.01 sec)mysql> SELECT ename,tel FROM emp_tel WHERE ename = '孙洪亮';Empty set (0.00 sec)mysql> SELECT ename,tel FROM t_employee WHERE ename = '孙洪亮';Empty set (0.00 sec)
5.2 不可更新的视图
要使视图可更新,视图中的行和底层基本表中的行之间必须存在一对一的关系。另外当视图定义出现如下情况时,视图不支持更新操作:
- 在定义视图的时候指定了“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;
- 视图定义基于一个
不可更新视图; - 常量视图。
举例:
mysql> CREATE OR REPLACE VIEW emp_dept-> (ename,salary,birthday,tel,email,hiredate,dname)-> AS SELECT ename,salary,birthday,tel,email,hiredate,dname-> FROM t_employee INNER JOIN t_department-> ON t_employee.did = t_department.did ;Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO emp_dept(ename,salary,birthday,tel,email,hiredate,dname)-> VALUES('张三',15000,'1995-01-08','18201587896',-> 'zs@atguigu.com','2022-02-14','新部门');#ERROR 1393 (HY000): Can not modify more than one base table through a join view 'atguigu_chapter9.emp_dept'
从上面的SQL执行结果可以看出,在定义视图的SELECT语句中使用了JOIN联合查询,视图将不支持更新操作。
虽然可以更新视图数据,但总的来说,视图作为
虚拟表,主要用于方便查询,不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。
