WITH CHECK OPTION 中 LOCAL和CASCADED
简介:本教程通过示例和明确说明帮助您了解
LOCAL
和CASCADED
在 WITH CHECK OPTION
子句之间的差异。
在开始本教程之前,您应熟悉WITH CHECK OPTION
子句。如果不是这种情况,您可以使用WITH CHECK OPTION子句教程遵循确保视图的一致性。
LOCAL&CASCADED检查范围简介
当您使用WITH CHECK OPTION
子句创建视图时,MySQL会检查通过视图更改的每一行,例如插入,更新,删除,以使其符合视图的定义。由于MySQL允许基于另一个视图创建视图,因此它还会检查从属视图中的规则以确保一致性。
为了确定检查范围,MySQL提供了两个选项:LOCAL
和CASCADED
。如果未在WITH CHECK OPTION
子句中明确指定关键字,则MySQL CASCADED
默认使用。
MySQL WITH CASCADED CHECK OPTION
为了理解其效果WITH CASCADED CHECK OPTION
,我们将举例说明。
首先,我们创建一个表名为t1,其中一列c的数据类型为整数。
DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( c INT );接下来,我们基于t1表创建一个名为v1的视图,以选择值大于10的行。
CREATE OR REPLACE VIEW v1 AS SELECT c FROM t1 WHERE c > 10;因为我们没有指定
WITH CHECK OPTION
,所以即使它不符合v1视图的定义,下面的语句仍然有效。
INSERT INTO v1(c) VALUES (5);然后,我们基于v1视图创建v2视图。这次,我们添加一个
WITH CASCADED CHECK OPTION
条款。
CREATE OR REPLACE VIEW v2 AS SELECT c FROM v1 WITH CASCADED CHECK OPTION;现在,我们 通过v2视图将值为5 的行插入到t1表中。
INSERT INTO v2(c) VALUES (5);MySQL发出以下错误消息:
ERROR 1369 (HY000): CHECK OPTION failed 'mysqldemo.v2'它失败,因为它创建了一个不符合v2视图定义的新行。 之后,我们基于v2创建一个名为v3的新视图。
CREATE OR REPLACE VIEW v3 AS SELECT c FROM v2 WHERE c < 20;我们通过v3视图在t1表中插入一个值为8的新行。
INSERT INTO v3(c) VALUES (8);MySQL发出以下错误消息:
ERROR 1369 (HY000): CHECK OPTION failed 'mysqldemo.v3'在INSERT语句失败,即使它看起来与V3视图的定义一致。 为什么? 因为v3视图依赖于v2视图,而v2视图具有
WITH CASCADED CHECK OPTION
。
但是,以下插入语句有效。
INSERT INTO v3(c) VALUES (30);因为v3视图没有
WITH CHECK OPTION
,并且语句符合v2视图的定义。
所以,最后:
当视图使用WITH CASCADED CHECK OPTION
时,MySQL会以递归方式检查视图的规则以及基础视图的规则。
MySQL与本地检查选项
让我们使用上面的相同示例WITH LOCAL CHECK OPTION
来查看差异。
首先,我们更改v2视图以使用WITH LOCAL CHECK OPTION
替代。
ALTER VIEW v2 AS SELECT c FROM v1 WITH LOCAL CHECK OPTION;其次,插入与上面示例相同的行。
INSERT INTO v2(c) VALUES (5);它成功了。 因为v2视图没有任何规则。v2视图取决于v1视图。但是,v1视图未指定检查选项,因此MySQL会跳过检查v1视图中的规则。 请注意,在使用
WITH CASCADED CHECK OPTION
创建的v2视图,此语句失败。
第三,通过v3视图将同一行插入到t1表中。
INSERT INTO v3(c) VALUES (8);它在这种情况下成功,因为MySQL没有检查v1视图的规则,因为
WITH LOCAL CHECK OPTION
v2视图。
另外请注意,在使用WITH CASCADED CHECK OPTION
创建的v2的示例中,此语句失败。
因此,如果视图使用 WITH LOCAL CHECK OPTION
,MySQL将检查具有WITH LOCAL CHECK OPTION
和WITH CASCADED CHECK OPTION
的视图规则。
它与使用WITH CASCADED CHECK OPTION
MySQL检查所有相关视图的规则的视图不同。
请注意,在MySQL 5.7.6之前,如果使用带有WITH LOCAL CHECK OPTION
的视图,MySQL仅检查当前视图的规则,而不检查基础视图的规则。