通过示例和清楚的说明帮助,了解WITH CHECK OPTION
子句中LOCAL
和CASCADED
之间的差异。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
在进行本教程之前,应该熟悉WITH CHECK OPTION
子句。如果不是这样,可以参阅WITH CHECK OPTION子句教程来遵循确保视图的一致性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
LOCAL&CASCADED检查范围介绍
当使用WITH CHECK OPTION
子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。因为MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
为了确定检查的范围,MySQL提供了两个选项:LOCAL
和CASCADED
。如果您没有在WITH CHECK OPTION
子句中显式指定关键字,则MySQL默认使用CASCADED
。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
MySQL与CASCADC检查选项
要了解使用CASCADED CHECK OPTION
的效果,请参阅下面的例子。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
首先,创建一个名为t1
的表,其中只有一个名称为:c
的列,它的数据类型为int
。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
USE testdb;
CREATE TABLE t1 (
c INT
);
接下来,基于t1
表创建一个名为v1
的视图,以选择值大于10
的行记录。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
CREATE OR REPLACE VIEW v1
AS
SELECT
c
FROM
t1
WHERE
c > 10;
因为没有指定WITH CHECK OPTION
,所以以下语句即使不符合v1
视图的定义也可以工作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
INSERT INTO v1(c) VALUES (5);
然后,基于v1
视图创建v2
视图。在v2
视图中添加一个WITH CASCADED CHECK OPTION
子句。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
CREATE OR REPLACE VIEW v2
AS
SELECT
c
FROM
v1
WITH CASCADED CHECK OPTION;
现在,通过v2
视图在t1
表中插入一个值为5
的行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
INSERT INTO v2(c) VALUES (5);
MySQL发出以下错误消息:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
Error Code: 1369. CHECK OPTION failed 'testdb.v2'
它失败了,因为它创建一个不符合v2
视图定义的新行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
之后,我们再创建一个基于v2
的名为v3
的新视图。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
CREATE OR REPLACE VIEW v3
AS
SELECT
c
FROM
v2
WHERE
c < 20;
我们通过v3
视图插入一个新行到t1
表中,值为8
。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
INSERT INTO v3(c) VALUES (8);
MySQL发出以下错误信息:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
Error Code: 1369. CHECK OPTION failed 'testdb.v3'
上面插入语句看起来符合v3
视图的定义,insert语句仍然执行失败。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
这是为什么呢?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
因为v3
视图取决于v2
视图,v2
视图具有WITH CASCADED CHECK OPTION
。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
但是,以下插入语句能正常工作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
INSERT INTO v3(c) VALUES (30);
因为v3
视图没有使用WITH CHECK OPTION
定义,并且该语句符合v2
视图的定义。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
所以,总而言之:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
当视图使用WITH CASCADED CHECK OPTION
时,MySQL会循环检查视图的规则以及底层视图的规则。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
MySQL WITH LOCAL CHECK OPTION
下面将演示使用 WITH LOCAL CHECK OPTION
选项,使用上面相同的示例来查看差异。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
首先,将v2
视图更改为使用WITH LOCAL CHECK OPTIONS
替代。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
ALTER VIEW v2 AS
SELECT
c
FROM
v1
WITH LOCAL CHECK OPTION;
其次,插入与上述示例相同的行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
INSERT INTO v2(c) VALUES (5);
它是可以成功执行的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
因为v2
视图没有任何规则。 v2
视图取决于v1
视图。 但是,v1
视图没有指定检查选项,因此MySQL跳过检查v1
视图中的规则。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
请注意,在使用
WITH CASCADED CHECK OPTION
创建的v2
视图中,此语句失败。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
第三,通过v3
视图将相同的行插入t1
表。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
INSERT INTO v3(c) VALUES (8);
在这种情况下可以执行成功,因为MySQL视图中的WITH LOCAL CHECK OPTIONS
选项没有检查v1
视图的规则。
另外,请注意,在使用WITH CASCADED CHECK OPTION
创建的v2
视图示例中,此语句执行失败。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
因此,如果视图使用WITH LOCAL CHECK OPTION
,MySQL会检查WITH LOCAL CHECK OPTION
和WITH CASCADED CHECK OPTION
选项的视图规则。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
与使用WITH CASCADED CHECK OPTION
的视图不同,MySQL检查所有依赖视图的规则。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html请注意,在MySQL 5.7.6之前,如果您使用带有
WITH LOCAL CHECK OPTION
的视图,MySQL只会检查当前视图的规则,并且不会检查底层视图的规则。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
2019-06-12 15:38 1F
好,清楚明了