MySQL数据库应用案例课堂
上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子句。