MySQL学习入门教程:WITH CHECK OPTION子句中LOCAL和CASCADED的差异

2018-11-3009:14:49数据库教程1 6,664 views字数 1994阅读模式

通过示例和清楚的说明帮助,了解WITH CHECK OPTION子句中LOCALCASCADED之间的差异。文章源自菜鸟学院-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提供了两个选项:LOCALCASCADED。如果您没有在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
);
SQL

接下来,基于t1表创建一个名为v1的视图,以选择值大于10的行记录。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

CREATE OR REPLACE VIEW v1 
AS
    SELECT 
        c
    FROM
        t1
    WHERE
        c > 10;
SQL

因为没有指定WITH CHECK OPTION,所以以下语句即使不符合v1视图的定义也可以工作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

INSERT INTO v1(c) VALUES (5);
SQL

然后,基于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;
SQL

现在,通过v2视图在t1表中插入一个值为5的行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

INSERT INTO v2(c) VALUES (5);
SQL

MySQL发出以下错误消息:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

Error Code: 1369. CHECK OPTION failed 'testdb.v2'
SQL

它失败了,因为它创建一个不符合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;
SQL

我们通过v3视图插入一个新行到t1表中,值为8文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

INSERT INTO v3(c) VALUES (8);
SQL

MySQL发出以下错误信息:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

Error Code: 1369. CHECK OPTION failed 'testdb.v3'
SQL

上面插入语句看起来符合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);
SQL

因为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

MySQL学习入门教程:WITH CHECK OPTION子句中LOCAL和CASCADED的差异文章源自菜鸟学院-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;
SQL

其次,插入与上述示例相同的行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

INSERT INTO v2(c) VALUES (5);
SQL

它是可以成功执行的。文章源自菜鸟学院-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);
SQL

在这种情况下可以执行成功,因为MySQL视图中的WITH LOCAL CHECK OPTIONS选项没有检查v1视图的规则。
另外,请注意,在使用WITH CASCADED CHECK OPTION创建的v2视图示例中,此语句执行失败。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

MySQL学习入门教程:WITH CHECK OPTION子句中LOCAL和CASCADED的差异文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

因此,如果视图使用WITH LOCAL CHECK OPTION,MySQL会检查WITH LOCAL CHECK OPTIONWITH CASCADED CHECK OPTION选项的视图规则。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

与使用WITH CASCADED CHECK OPTION的视图不同,MySQL检查所有依赖视图的规则。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

请注意,在MySQL 5.7.6之前,如果您使用带有WITH LOCAL CHECK OPTION的视图,MySQL只会检查当前视图的规则,并且不会检查底层视图的规则。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/8419.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/8419.html
Comments  1  访客  1
    • 小白 0

      好,清楚明了

    Comment

    匿名网友 填写信息

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

    确定