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 OPTIONv2视图。
另外请注意,在使用WITH CASCADED CHECK OPTION创建的v2的示例中,此语句失败。

WITH LOCAL CHECK OPTION,MySQL将检查具有WITH LOCAL CHECK OPTION和WITH CASCADED CHECK OPTION的视图规则。
它与使用WITH CASCADED CHECK OPTIONMySQL检查所有相关视图的规则的视图不同。
请注意,在MySQL 5.7.6之前,如果使用带有WITH LOCAL CHECK OPTION的视图,MySQL仅检查当前视图的规则,而不检查基础视图的规则。
