MySQL 视图(2)

上一篇:MySQL视图(1)


基于其他视图

案例对 WITH [CASCADED | LOCAL] CHECK OPTION 进行释义

创建视图时,可以基于表 / 多个表,也可以使用 其他视图+表 / 其他视图 + 其他视图 的方式进行组合。

总结

  • 更新视图,同时也会更新基表数据。更新基表,对应的视图数据也会更新。
  • WITH CASCADED CHECK OPTION 会检测当前视图(v3)WHERE 子句约束以及所有底部视图 WHERE 子句约束条件(v1/v2)
  • 当使用 CASCADED 时,不仅需要满足当前视图 WHERE 子句约束,而且无论底部视图是否有 WITH CHECK OPTION 选项,都需要满足
drop table t1;
drop view v1,v2,v3;

CREATE TABLE t1 (a INT);

CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;

CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4
WITH LOCAL CHECK OPTION;

CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 8
WITH CASCADED CHECK OPTION;

INSERT INTO v3 values(9); -- 报错,不符合 v3 视图中小于8的约束
INSERT INTO v3 values(4); -- 报错,不符合 v2 视图中大于4的约束
INSERT INTO v3 values(11);-- 报错,不符合 v1 视图中大于4的约束
INSERT INTO v3 values(6); -- 正常,符合 v1/v2/v3 视图约束
INSERT INTO v3 values(7); -- 正常,符合 v1/v2/v3 视图约束
  • WITH [CASCADED | LOCAL] CHECK OPTION 均会检测多层视图,如下案例,插入 v3 视图数据时,会检测 v1、v2 的数据约束条件
  • with local check option 时,首先需要满足当前视图的条件,然后对于底部视图,也是先看是否有指定的 with check option 选项语句,有的话对应处理,无则不需要满足底部视图的 WHERE 子句条件。
drop table t1;
drop view v1,v2,v3;

CREATE TABLE t1 (a INT);

CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;

-- 没有 check option 选项
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4; 

CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14
WITH LOCAL CHECK OPTION;

INSERT INTO v3 values(3); -- 正常,因为基表 v2 没有 check option 所以不做约束
INSERT INTO v3 values(4); -- 正常,因为基表 v2 没有 check option 所以不做约束
INSERT INTO v3 values(11);-- 报错,必须符合基表 v1 小于10的约束,因为有check option 选项
INSERT INTO v3 values(10);-- 报错,必须符合基表 v1 小于10的约束,因为有check option 选项


-- 初始化环境
drop table t1;
drop view v1,v2,v3;

CREATE TABLE t1 (a INT);

CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;

-- 有 local check option 选项
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4 
WITH LOCAL CHECK OPTION;

CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14
WITH LOCAL CHECK OPTION;

INSERT INTO v3 values(3); -- 报错,必须符合基表 v2 大于 4 的约束,因为有check option选项
INSERT INTO v3 values(4); -- 报错,必须符合基表 v2 大于 4 的约束,因为有check option选项

当前视图没有 check option 约束时,可以更新当前视图数据,但是在当前视图中不显示该数据(参考情况1)。同时需要保证在该视图的 select_statement 中,如果对象是视图,并且也没有 check option 约束限制(参考情况2),有也没事,但是不能限制,才可以正常插入、更新数据(参考情况3)。

-- 情况 1:视图无 check option 选项,关联表
drop table t1;
drop view v1,v2,v3;
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10;
INSERT INTO v1 values(15);  -- 正常,因为没有 check option可以更新,但是在视图中不显示而已。


-- 情况 2:视图无 check option 选项,关联其他视图也无 check option 选项
drop table t1;
drop view v1,v2,v3;
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;

-- 没有 check option 选项
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4; 
CREATE VIEW v3 AS SELECT * FROM v2 WH
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值