Mysql教程

8.5更新视图

更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。本小节将 重点讲解更新视图的方法和更新视图的限制。

【示例8-11】下面在视图department_view3中对视图进行更新。department_view3是 department表的视图。department表的记录如下:

mysql> select * from department;
+------+--------+------------------+----------+
| d_id | d_name | function         | address  |
+------+--------+------------------+----------+
| 1001 | 人事部  | 管理公司人事变动    | 2号楼3层  |
| 1002 | 生产部  | 主管生产           | 5号楼1层  |
+------+--------+------------------+----------+
2 rows in set (0.00 sec)

在更新之前,先创建视图department_view3。代码如下:

CREATE VIEW department_view3( name, function, address)AS SELECT d_name, function, address FROM department WHERE d_id=1001;

向视图department_view3中更新一条记录。新记录的name的值为“科研部”,function 的值为“新产品研发”,address的值为“3号楼5层”。更新语句执行如下:

UPDATE department_view3 SET name='科研部',function='新产品研发',address='3号楼5层';
执行结果显示更新成功。查看视图department_view3的记录。记录显示如下:
mysql> select * from department_view3;
+--------+------------+----------+
| name   | function   | address  |
+--------+------------+----------+
| 科研部      | 新产品研发        | 3号楼5层      |
+--------+------------+----------+
1 row in set (0.00 sec)

结果显示,视图已经更新成功。再查询department表的记录。记录显示如下:

mysql> select * from department_view3;
+--------+------------+----------+
| name   | function   | address  |
+--------+------------+----------+
| 科研部      | 新产品研发        | 3号楼5层      |
+--------+------------+----------+
1 row in set (0.00 sec)

结果显示,d_id为1001的记录已经更新。虽然,UPDATE语句更新的是视图 department_view3。但实际上更新的是department表。上面的UPDATE语句可以等价为:

UPDATE department SET d_name='科研部'function=|新产品研发',address='3号楼5层,WHERE d_id=1001;

由上面可以看出,对视图的更新最后都是实现在基本表上的。更新视图时,实际上更新的是基本表上的记录。但是,并不是所有的视图都可以更新的。以下这几种情况是不能更新视图的:

(1)视图中包含SUM()、COUNT(), MAX()和MIN()等函数。

(2)视图中包含UNION、UNION ALL、DISTTNCT、GROUP BY 和 HAVIG 等关键字。

(3)常量视图。

(4)视图中的SELECT中包含子查询

(5)由不可更新的视图导出的视图

(6)创建视图时,ALGORITHM为TEMPTABLE类型

(7)视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。例如,表中 包含的name字段没有默认值,但是视图中不包括该字段。那么这个视图是不能更新的。 因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有胃11值插入。数据 库系统是不会允许这样的情况出现的,其会阻止这个视图更新。

注意:视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查 询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果 没有全面考虑在视图中更新数据的限制,可能会造成数据更新失败。

除了上述条件不能更新视图以外,WITH [ CASCADED| LOCAL]CHECK OPTION也将决定视图能否更新。LOCAL参数表示更新视图时要满足该视图本身的定义的条件即可; CASCADED参数表示更新视图时要满足所有相关视图和表的条件。没有指明时,默认为 CASCADED。


关注微信获取最新动态