mysql视图之检查选项子句(WITH CHECK OPTION子句中的local和cascaded)

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。因为mysql允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项:LOCALCASCADED。如果我们没有在WITH CHECK OPTION子句中显式指定关键字,则mysql默认使用CASCADED

我们先来创建一个表来感受下cascaded选项是什么效果(一个名为t1的表,其中只有一个名称为:c的列,它的数据类型为int。):

USE testdb;
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视图,并且在v2视图中添加一个WITH CASCADED CHECK OPTION子句:

CREATE OR REPLACE VIEW v2 
AS
    SELECT 
        c
    FROM
        v1 
WITH CASCADED CHECK OPTION;

我们再来通过v2视图在t1表中插入一个值为5的行:

INSERT INTO v2(c) VALUES (5);

mysql发出以下错误消息:

Error Code: 1369. CHECK OPTION failed 'testdb.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 'testdb.v3'

上面插入语句看起来符合v3视图的定义,但是为什么会插入失败呢?这是因为v3视图取决于v2视图,v2视图具有WITH CASCADED CHECK OPTION。但是,以下插入语句能正常工作:

INSERT INTO v3(c) VALUES (30);

这是因为v3视图没有使用WITH CHECK OPTION定义,并且该语句符合v2视图的定义。总而言之,当视图使用WITH CASCADED CHECK OPTION时,mysql会循环检查视图的规则以及底层视图的规则,过程如下图:

完事我们使用 WITH LOCAL CHECK OPTION 选项,使用上面相同的示例来查看差异,先来将v2视图更改为使用WITH LOCAL CHECK OPTIONS替代:

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视图中的WITH LOCAL CHECK OPTIONS选项没有检查v1视图的规则。不过,在使用WITH CASCADED CHECK OPTION创建的v2视图示例中,此语句执行失败。看下流程图:

因此,如果视图使用WITH LOCAL CHECK OPTION,mysql会检查WITH LOCAL CHECK OPTIONWITH CASCADED CHECK OPTION选项的视图规则。与使用WITH CASCADED CHECK OPTION的视图不同,mysql检查所有依赖视图的规则。不过我们要注意,在mysql5.7.6之前,如果我们使用带有WITH LOCAL CHECK OPTION的视图,mysql只会检查当前视图的规则,并且不会检查底层视图的规则。

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

猜你喜欢

转载自blog.csdn.net/luyaran/article/details/81018763