在WITH CHECK OPTION子句中的LOCAL&CASCADED
简介:在本教程中,您将在WITH CHECK OPTION子句中了解LOCAL和CASCADED之间的区别。
请注意,在继续本教程之前,您应该熟悉WITH CHECK OPTION子句。
如果不是这种情况,可以遵循WITH CHECK OPTION教程。
本地和级联检查范围介绍
当您使用WITH CHECK OPTION子句创建视图并针对该视图发出DML语句(例如INSERT,UPDATE和DELETE)时,MySQL会检查以确保要更改的行符合该视图的定义。
由于可以基于其他视图创建视图,因此MySQL还会检查从属视图中的规则以确保数据一致性。
为了确定检查范围,MySQL提供了两个选项:LOCAL和CASCADED。
如果您没有在WITH CHECK OPTION子句中明确指定关键字,则MySQL默认使用CASCADED。
具有级联检查选项的MySQL
考虑以下示例,以了解WITH CASCADED CHECK OPTION的效果:
首先,创建一个名为t1的表,该表的一列c的数据类型为整数。
CREATE TABLE t1 ( c INT );
接下来,基于t1表创建视图v1,其中c列中的数据大于10。
CREATE OR REPLACE VIEW v1 AS SELECT c FROM t1 WHERE c > 10;
因为我们没有指定WITH CHECK OPTION,所以以下语句即使不符合v1视图的定义也可以工作。
INSERT INTO v1(c) VALUES (5);
然后,使用WITH CASCADED CHECK OPTION子句基于v1视图创建视图v2。
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 Code: 1369. CHECK OPTION failed 'classicmodels.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 Code: 1369. CHECK OPTION failed 'classicmodels.v3'
即使该行似乎符合v3视图的定义,insert语句也会失败。
因为视图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);
在这种情况下它成功了,因为由于v2视图的WITH LOCAL CHECK OPTION,MySQL没有检查v1视图的规则。
此外,请注意,此语句在v2使用WITH CASCADED CHECK OPTION创建的示例中失败。
因此,如果视图使用WITH LOCAL CHECK OPTION,MySQL会检查具有WITH LOCAL CHECK OPTION和CASCASED CHECK OPTION的视图规则。
它与使用WITH WITH CASCADED CHECK OPTION的视图不同,MySQL会检查所有从属视图的规则。
请注意,在MySQL 5.7.6之前,如果您使用带有WITH LOCAL CHECK OPTION的视图,则MySQL仅检查当前视图的规则,而不检查基础视图的规则。