上QQ阅读APP看书,第一时间看更新
7.5 更新视图
更新视图是指通过视图来插入、更新、删除表中的数据。视图是一个虚拟表,其中没有数据,通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。本节将介绍更新视图的三种方法:INSERT、UPDATE和DELETE。
【例7.10】使用UPDATE语句更新视图view_t。
代码如下:
UPDATE view_t SET quantity=5;
执行视图更新之前,查看基本表和视图的信息,执行结果如下:
mysql> SELECT * FROM view_t; +----------+ | quantity | +----------+ | 3 | +----------+ 1 row in set (0.00 sec) mysql> SELECT * FROM t; +---------+-------+ | quantity| price | +---------+-------+ | 3 | 50 | +---------+-------+ 1 row in set (0.00 sec)
使用UPDATE语句更新视图view_t,执行过程如下:
mysql> UPDATE view_t SET quantity=5; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
视图更新之后,基本表和相关视图的内容如下:
mysql> SELECT * FROM t; +----------+-------+ | quantity | price | +----------+-------+ | 5 | 50 | +----------+-------+ 1 row in set (0.02 sec) mysql> SELECT * FROM view_t; +----------+ | quantity | +----------+ | 5 | +----------+ 1 row in set (0.00 sec) mysql> SELECT * FROM view_t2; +------+-------+-------+ | qty | price | total | +------+-------+-------+ | 5 | 50 | 250 | +------+-------+-------+ 1 row in set (0.00 sec)
对视图view_t更新后,基本表t的内容也更新了,同样基于基本表t生成的另外一个视图view_t2中的内容也会更新。
【例7.11】使用INSERT语句在基本表t中插入一条记录。
代码如下:
INSERT INTO t VALUES (3,5);
执行结果如下:
mysql> INSERT INTO t VALUES(3,5); Query OK, 1 row affected (0.04 sec) mysql> SELECT * FROM t; +----------+-------+ | quantity | price | +----------+-------+ | 5 | 50 | | 3 | 5 | +----------+-------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM view_t2; +------+-------+-------+ | qty | price | total | +------+-------+-------+ | 5 | 50 | 250 | | 3 | 5 | 15 | +------+-------+-------+ 2 rows in set (0.00 sec)
向表t中插入一条记录,通过SELECT查看表t和视图view_t2,可以看到其中的内容也跟着更新了。视图更新的不仅仅是数量和单价,总价也会更新。
【例7.12】使用DELETE语句删除视图view_t2中的一条记录。
代码如下:
DELETE FROM view_t2 WHERE price=5;
执行结果如下:
mysql> DELETE FROM view_t2 WHERE price=5; Query OK, 1 row affected (0.03 sec) mysql> SELECT * FROM view_t2; +------+-------+-------+ | qty | price | total | +------+-------+-------+ | 5 | 50 | 250 | +------+-------+-------+ 1 row in set (0.00 sec) mysql> SELECT * FROM t; +----------+-------+ | quantity | price | +----------+-------+ | 5 | 50 | +----------+-------+ 1 row in set (0.02 sec)
从执行结果中看,在视图view_t2中删除了price=5的记录。因为视图中的删除操作最终是通过删除基本表中的相关记录实现的,所以查看删除操作之后的表t和视图view_t2,可以看到通过视图删除了其所依赖的基本表中的数据。
当视图中含有如下内容时,视图的更新操作将不能被执行:
(1)在定义视图的SELECT语句后的字段列表中使用了数学表达式。
(2)在定义视图的SELECT语句后的字段列表中使用了聚合函数。
(3)在定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY或HAVING子句。