可更新视图是指通过视图,来更新、插入、删除基本表中的数据。视图是一个虚拟表,即对视图的更新,实质上是更新基表。但是视图的构造很多时候是由多个表连接查询,以及结合聚合函数,分组过滤等等定义的。对于这类的视图,想要去更新,恐怕就显得力不从心了。因为涉及到多张表。本文简要描述可更新视图的特点并给出演示。

一、不带check option更新

-- 当前环境
mysql> show variables like 'version';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| version | 5.7.17 |
+---------------+--------+
-- 可更新视图演示DROP TABLE IF EXISTS items;CREATE TABLE items
(
   id INT AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(100) NOT NULL,
   price DECIMAL(11, 2) NOT NULL
);-- 为items表填充数据INSERT INTO items(name, price)
VALUES ('Laptop', 700.56), ('Desktop', 699.99), ('iPad', 700.50);CREATE OR REPLACE VIEW vw_items
ASSELECT *FROM itemsWHERE price > 700;-- 查询视图SELECT * FROM vw_items;-- 以下语句插入成功,基表和视图同时可见INSERT INTO vw_items
VALUES (NULL, 'iPhone', 800.50);-- 以下语句插入成功,基表可见,因为视图包含了where子句对其过滤INSERT INTO vw_items
VALUES (NULL, 'iPhone4', 500.50);-- Query OK, 1 row affected (0.00 sec)SELECT * FROM vw_items;

二、基于check option更新

-- 先清空一下数据TRUNCATE TABLE items;CREATE OR REPLACE VIEW vw_items_check
ASSELECT *FROM itemsWHERE price > 700WITH CHECK OPTION;-- 下面基于vw_items_check创建另外一个视图vw_items_check2
CREATE OR REPLACE VIEW vw_items_check2
ASSELECT *FROM vw_items_checkWHERE price < 1000WITH LOCAL CHECK OPTION;-- 下面基于vw_items_check创建另外一个视图vw_items_check3
CREATE OR REPLACE VIEW vw_items_check3
ASSELECT *FROM vw_items_checkWHERE price < 1000WITH CASCADED CHECK OPTION;-- 基于视图vw_items_check插入数据,以下语句插入失败,不符合视图过滤条件
INSERT INTO vw_items_check
VALUES (NULL, 'Laptop', 600.56);-- ERROR 1369 (HY000): CHECK OPTION failed 'sakila.vw_items_check'-- 基于视图vw_items_check插入数据,以下语句执行成功
-- 满足where子句过滤条件,插入后基表和视图数据可见
INSERT INTO vw_items_check
VALUES (NULL, 'Laptop', 700.56);-- 基于视图vw_items_check2插入数据成功,值符合过滤条件
INSERT INTO vw_items_check2
VALUES (NULL, 'iPhone', 800.50);-- 基于视图vw_items_check3插入数据成功,值符合过滤条件
INSERT INTO vw_items_check3
VALUES (NULL, 'iPhone3', 800.50);-- 下面使用一个不符合预期的值进行插入
-- 基于视图vw_items_check2插入数据失败,值不符合底层过滤条件
INSERT INTO vw_items_check2
VALUES (NULL, 'iPhone_chk2', 700);-- ERROR 1369 (HY000): CHECK OPTION failed 'sakila.vw_items_check2'-- 基于视图vw_items_check3插入数据失败,值不符合底层过滤条件
INSERT INTO vw_items_check3
VALUES (NULL, 'iPhone_chk2', 700);-- ERROR 1369 (HY000): CHECK OPTION failed 'sakila.vw_items_check3'-- 通过上面的测试发现,使用CASCADED与LOCAL创建的视图都会检查底层依赖
-- 在此并无特别
-- 说明5.7.6版本以前,视图vw_items_check2不符合底层预期时,也可以成功执行

三、进一步测试对比CASCADED与LOCAL

-- 再次创建如下视图,此时的视图底层基于非check视图CREATE OR REPLACE VIEW vw_items_check4
AS
   SELECT *
   FROM vw_items
   WHERE price < 1000
   WITH LOCAL CHECK OPTION;CREATE OR REPLACE VIEW vw_items_check5
AS
   SELECT *
   FROM vw_items
   WHERE price < 1000
   WITH CASCADED CHECK OPTION;-- 基于视图vw_items_check4插入数据成功,值不符合底层过滤条件
-- 但是此时可以成功插入,说明local生效,不依赖底层过滤条件
INSERT INTO vw_items_check4
VALUES (NULL, 'iPhone_chk4', 700);    Query OK, 1 row affected (0.00 sec)-- 下面验证插入结果,查询vw_items_check4被过滤
SELECT * FROM vw_items_check4;
+----+---------+--------+
| id | name | price |
+----+---------+--------+
| 1 | Laptop | 700.56 |
| 2 | iPhone | 800.50 |
| 3 | iPhone3 | 800.50 |
+----+---------+--------+-- 查询基表数据存在
SELECT * FROM items;
+----+-------------+--------+
| id | name | price |
+----+-------------+--------+
| 1 | Laptop | 700.56 |
| 2 | iPhone | 800.50 |
| 3 | iPhone3 | 800.50 |
| 4 | iPhone_chk4 | 700.00 |
+----+-------------+--------+-- 基于视图vw_items_check5插入数据失败,cascade级联校验生效
INSERT INTO vw_items_check5
VALUES (NULL, 'iPhone_chk5', 700);-- ERROR 1369 (HY000): CHECK OPTION failed 'sakila.vw_items_check5'

四、基于视图删除

-- 基于视图vw_items_check4删除数据
-- 如下,提示删除成功,但基表数据未删除,因为不满足过滤条件
DELETE FROM vw_items_check4
WHERE id = 4;-- Query OK, 0 rows affected (0.00 sec)-- Author : Leshami
-- Blog : http://blog.csdn.net/leshami-- 基于视图vw_items_check5删除数据
-- 如下,提示删除成功,但基表数据未删除,因为不满足过滤条件
DELETE FROM vw_items_check5
WHERE id = 4;-- Query OK, 0 rows affected (0.00 sec)-- 满足过滤条件 id为3的记录能够被删除
DELETE FROM vw_items_check5
WHERE id = 3;-- Query OK, 1 row affected (0.00 sec)-- 删除后的结果
SELECT * FROM items;
+----+-------------+--------+
| id | name | price |
+----+-------------+--------+
| 1 | Laptop | 700.56 |
| 2 | iPhone | 800.50 |
| 4 | iPhone_chk4 | 700.00 |
+----+-------------+--------+

五、更新视图

-- 由于不符合过滤条件,2个视图均无法更新
UPDATE vw_items_check5
SET price = 701
WHERE id = 4;    Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0UPDATE vw_items_check4
SET price = 701
WHERE id = 4;   Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0-- 基于视图vw_items5更新数据,此时选择满足条件的记录来更新
-- 更新为比过滤条件低的价格,无法成功更新
UPDATE vw_items_check5
SET price = 700
WHERE id = 2; ERROR 1369 (HY000): CHECK OPTION failed 'sakila.vw_items_check5'-- 更新为符合条件时,被成功更新
UPDATE vw_items_check5
SET price = 900
WHERE id = 2;Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

六、cascade 与local的差异(官方描述)

-- 未指定local与cascade时,缺省为cascade
-- 官方给出的关于LOCAL与CASCADED对比
/*• With LOCAL, the view WHERE clause is checked, then checking recurses to underlying views and
applies the same rules.• With CASCADED, the view WHERE clause is checked, then checking recurses to underlying views,
adds WITH CASCADED CHECK OPTION to them (for purposes of the check; their definitions remain
unchanged), and applies the same rules.• With no check option, the view WHERE clause is not checked, then checking recurses to underlying
views, and applies the same rules.
*/

七、结论:

1、不使用check子句情形,可以对视图进行DML操作,影响基表数据
2、使用check子句情形,所有的DML必须满足过滤条件,否则报错,update语句更新后的值不符合过滤条件则无法更新
3、LOCAL与CASCADED选项受底层视图影响,如果底层视图带check,则两者作用相同,否则LOCAL进作用于当前

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2tchhwnywegwc

MySQL可更新视图相关推荐

  1. SQL语法——创建视图、可更新视图

    CREATE VIEW语句简介 CREATE [ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}] VIEW view_name [(column_list)] ...

  2. MySql数据库之视图(定义视图、查询视图、更新视图、视图的作用)

    目录 一.定义视图 1.建立视图 2.删除视图 二.查询视图 三.更新视图 四.视图的作用 一.定义视图 1.建立视图 语法:CREATE VIEW 视图名 [列名]... AS 子查询 [WITH ...

  3. mysql视图之创建可更新视图

    我们知道,在mysql中,视图不仅是可查询的,而且是可更新的.这意味着我们可以使用insert或update语句通过可更新视图插入或更新基表的行. 另外,我们还可以使用delete语句通过视图删除底层 ...

  4. mysql视图数据更新_怎么更新Mysql数据表视图中数据

    本篇文章主要给大家介绍mysql数据表中视图中数据的更新操作. 相关mysql视频教程推荐:<mysql教程> mysql数据表视图的定义及相关操作,如查询.修改.删除.添加等操作介绍,在 ...

  5. MySQL视图——创建视图、修改视图、删除视图、查看视图和更新视图

    一.创建视图 语法:          create view 视图名          as          查询语句: 案例 1. 查询姓名中包含k字符的员工名.部门名和工种信息 ①创建视图my ...

  6. mysql view none,MySQL笔记之视图的使用详解

    什么是视图 视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据. 这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据. 数 ...

  7. mysql七:视图、触发器、事务、存储过程、函数

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  8. MySQL中的视图操作

    文章目录 1 为什么要使用视图 2 创建视图 3 查看视图 4 更新视图数据 5 修改视图 6 删除视图 1 为什么要使用视图 小学的时候,每年都会举办一次抽考活动,意思是从每一个班级里面筛选出几个优 ...

  9. mysql常用的视图_MySQL视图

    MySQL视图的基本操作 视图是数据库中的虚拟表.包含一系列带有名称的行和列数据.视图是从一个或者多个表中导出的,视图的行为与表非常相似,用户可以使用SELECT语句查询数据,以及使用INSERT.U ...

最新文章

  1. JPA(二)之CRUD操作
  2. GBDT原来是这么回事
  3. python调用zabbix api接口实时展示数据
  4. Spring Security 实战干货:实现自定义退出登录
  5. SQL ALTER TABLE 语句
  6. 事件查看器ID 1041
  7. 【opencv有趣应用】图像拼图
  8. 灵魂拷问:如何检查 Java 数组中是否包含某个值 ?
  9. PDF Suite Pro(PDF全能工具箱电脑版)官方正式版V19.0.22 | 含ocr文字识别软件 | pdf全能工具箱怎么样?
  10. php语言的cmpp协议应用
  11. idea中maven报错Cannot reconnect
  12. KVM管理虚拟机:常用命令
  13. MySQL数据库(九) 集群 Cluster 和性能优化
  14. java方法重写[详解]
  15. Arcgis常用功能 Python脚本
  16. ie html5 支持相机,HTML5IE浏览器兼容问题以及图像元素
  17. vue3使用dplayer视频播放器
  18. 松江区专利工作试点和示范企业认定政策解读
  19. 宠辱不惊闲看庭前花开花落;去留无意漫观天外云展云舒
  20. Linux防火墙设置常用命令

热门文章

  1. 少儿编程Scratch第三讲:宇宙大战.枪战游戏
  2. Android 笔记:获取本机手机号(适用于双卡双待手机)
  3. linux grep 多个文件,Linux grep 多个关键字-Fun言
  4. 在GCE上安装Apache、tomcat等
  5. 微信小程序使用wx.openDocument打开文件时报fail filetype not supported
  6. 问题 H: 2.13 节日促销 商店举行节日促销活动,设某商品销售价格按顾客购买量的大小有不同的折扣率,规则如下: 编程计算当输入某种商品的购买量和单价后,能计算出折扣后的单价及货款。
  7. 技术人 | 如何写出一篇好的技术方案?
  8. html css is图片,isbackground
  9. Oracle undo保留时间的几个相关参数
  10. [Erlang 0057] Erlang 排错利器: Erlang Crash Dump Viewer