上一篇: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

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



