一. 更新视图
更新视图是指通过视图来插入、更新、删除表中的数据。视图是一个虚拟表,其中没有数据,通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。
更新视图的三种方法:INSERT、UPDATE 和 DELETE。
1. 使用 UPDATE 语句更新视图
【例】使用 UPDATE 语句更新视图 view_t。
更新前:
mysql> SELECT * FROM view_t;
+----------+
| quantity |
+----------+
| 3 |
+----------+
更新语句:
mysql> UPDATE view_t SET quantity=5;
Query OK, 1 row affected (0.13 sec)
更新后:
mysql> SELECT * FROM view_t;
+----------+
| quantity |
+----------+
| 5 |
+----------+
对视图 view_t 更新后,基本表 t 也更新了。
mysql> SELECT * FROM t;
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
2. 使用 INSERT 语句更新视图
【例】使用 INSERT 语句在基本表 t 中插入一条记录。
插入前:
mysql> SELECT * FROM t;
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
插入语句:
mysql> INSERT INTO t VALUES (3,5);
Query OK, 1 row affected (0.10 sec)
更新后:
mysql> SELECT * FROM t;
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
| 3 | 5 |
+----------+-------+
基于 t 表的视图 view_t2 也跟新了:
mysql> SELECT * FROM view_t2;
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 5 | 50 | 250 |
| 3 | 5 | 15 |
+------+-------+-------+
3. 用 DELETE 语句更新视图
【例】使用 DELETE 语句删除视图 view_t2 中的一条记录。
更新前:
mysql> SELECT * FROM view_t2;
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 5 | 50 | 250 |
| 3 | 5 | 15 |
+------+-------+-------+
更新语句:
mysql> DELETE FROM view_t2 WHERE price=5;
Query OK, 1 row affected (0.10 sec)
更新后:
mysql> SELECT * FROM view_t2;
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 5 | 50 | 250 |
+------+-------+-------+
二. 更新视图的限制
并不是所有的视图都可以更新,以下几种情况是不能更新视图的:
1. 视图中包含 COUNT()、SUM()、MAX() 和 MIN() 等聚合函数。
2. 视图中包含 UNION、UNION ALL、DISTINCT、 GROUP BY 和 HAVING 等关键字。
3. 常量视图。
4. 视图中的 SELECT 中包含子查询。
5. 由不可更新的视图导出的视图。
6. 创建视图时,ALGORITHM 为 TEMPTABLE 类型。
【注】 视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询教据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,可能会造成数据更新失败。