检查选项
当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。 MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,MySQL提供了两个选项: CASCADED 和 LOCAL,默认值为 CASCADED 。
CREATE VIEW xx AS SELECT id,name FROM XXXX WHERE id <= 20 WITH CASCADED CHECK OPTION;
CASCADED
意为“级联”。
比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1。
具体来说,例如下面这条SQL语句:
create view v1 as select id,name from student where id <= 20;
其没有添加检查选项的子句,所以运行时并不会检查id <= 20;
再看下面这条:
create view v2 as select id,name from v1 where id >= 10 with cascaded check option;
它是基于v1来建立视图的,并且添加了检查选项的子句,所以它会检测v2的id >= 10 ;又由于它是基于v1而创建的视图,cascaded会与之相连,所以也会检查v1的 id <= 20。
最后看这条:
create view v3 as select id,name from v2 where id <= 15;
v3是基于v2来建立视图的,v2又是基于v1来建立视图的;又因为v3本身没有添加检查选项的子句,所以只会检测v2和v1的条件。
LOCAL
意为 本地。
比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创
建时未指定检查选项。 则在执行检查时,知会检查v2,不会检查v2的关联视图v1。
具体来说,
-- 创建v1视图 create view v1 as select id,name from student where id <= 15; -- 创建v2视图 create view v2 as select id,name from v2 where id >= 10 with local check option;
创建v1视图没有指定检查选项,创建v2视图时(基于v1)指定了local的检查选项;那么会对v2进行条件检测,然后递归到v1;由于v1本身没有指定检查选项,所以不进行检测,这就是local的检查选项。
再来创建v3:
create view v3 as select id,name from v2 where id < 20;
v3本身没有指定检查选项,所以不检测;递归到v2,v2有local的检查选项,进行检测;再递归到v1,没有检查选项,不进行检测。
END