5.1 一般情况

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

举例:UPDATE操作

  1. mysql> SELECT ename,tel FROM emp_tel WHERE ename = '孙洪亮';
  2. +---------+-------------+
  3. | ename | tel |
  4. +---------+-------------+
  5. | 孙洪亮 | 13789098765 |
  6. +---------+-------------+
  7. 1 row in set (0.01 sec)
  8. mysql> UPDATE emp_tel SET tel = '13789091234' WHERE ename = '孙洪亮';
  9. Query OK, 1 row affected (0.01 sec)
  10. Rows matched: 1 Changed: 1 Warnings: 0
  11. mysql> SELECT ename,tel FROM emp_tel WHERE ename = '孙洪亮';
  12. +---------+-------------+
  13. | ename | tel |
  14. +---------+-------------+
  15. | 孙洪亮 | 13789091234 |
  16. +---------+-------------+
  17. 1 row in set (0.00 sec)
  18. mysql> SELECT ename,tel FROM t_employee WHERE ename = '孙洪亮';
  19. +---------+-------------+
  20. | ename | tel |
  21. +---------+-------------+
  22. | 孙洪亮 | 13789091234 |
  23. +---------+-------------+
  24. 1 row in set (0.00 sec)

举例:DELETE操作

  1. mysql> SELECT ename,tel FROM emp_tel WHERE ename = '孙洪亮';
  2. +---------+-------------+
  3. | ename | tel |
  4. +---------+-------------+
  5. | 孙洪亮 | 13789091234 |
  6. +---------+-------------+
  7. 1 row in set (0.00 sec)
  8. mysql> DELETE FROM emp_tel WHERE ename = '孙洪亮';
  9. Query OK, 1 row affected (0.01 sec)
  10. mysql> SELECT ename,tel FROM emp_tel WHERE ename = '孙洪亮';
  11. Empty set (0.00 sec)
  12. mysql> SELECT ename,tel FROM t_employee WHERE ename = '孙洪亮';
  13. Empty set (0.00 sec)

5.2 不可更新的视图

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

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

举例:

  1. mysql> CREATE OR REPLACE VIEW emp_dept
  2. -> (ename,salary,birthday,tel,email,hiredate,dname)
  3. -> AS SELECT ename,salary,birthday,tel,email,hiredate,dname
  4. -> FROM t_employee INNER JOIN t_department
  5. -> ON t_employee.did = t_department.did ;
  6. Query OK, 0 rows affected (0.01 sec)
  1. mysql> INSERT INTO emp_dept(ename,salary,birthday,tel,email,hiredate,dname)
  2. -> VALUES('张三',15000,'1995-01-08','18201587896',
  3. -> 'zs@atguigu.com','2022-02-14','新部门');
  4. #ERROR 1393 (HY000): Can not modify more than one base table through a join view 'atguigu_chapter9.emp_dept'

从上面的SQL执行结果可以看出,在定义视图的SELECT语句中使用了JOIN联合查询,视图将不支持更新操作。

虽然可以更新视图数据,但总的来说,视图作为虚拟表,主要用于方便查询,不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。