求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 

mysql教程
MySQL快速学习入门
MySQL是什么
MySQL安装
MySQL示例数据库
MySQL导入示例数据库
MySQL基础教程
MySQL查询数据
MySQL WHERE语句
MySQL插入数据
MySQL更新表数据
MySQL删除表数据
MySQL创建与删除数据库
MySQL创建表
MySQL修改表结构
MySQL重命名表
MySQL数据类型
高级部分
MySQL技巧
MySQL存储过程
MySQL视图
MySQL触发器
MySQL管理
MySQL全文搜索
MySQL函数
应用程序连接
MySQL+Node.js连接和操作
Python+MySQL连接和操作
 
 

MySQL local和cascaded检查选项子句
730 次浏览
6次  

本教程通过示例和清楚的说明帮助,了解WITH CHECK OPTION子句中LOCAL和CASCADED之间的差异。

在进行本教程之前,应该熟悉WITH CHECK OPTION子句。如果不是这样,可以参阅WITH CHECK OPTION子句教程来遵循确保视图的一致性。

LOCAL&CASCADED检查范围介绍

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。因为MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。

为了确定检查的范围,MySQL提供了两个选项:LOCAL和CASCADED。如果您没有在WITH CHECK OPTION子句中显式指定关键字,则MySQL默认使用CASCADED。

MySQL与CASCADC检查选项

要了解使用CASCADED CHECK OPTION的效果,请参阅下面的例子。

首先,创建一个名为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视图的定义,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

下面将演示使用 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 OPTION和WITH CASCADED CHECK OPTION选项的视图规则。

与使用WITH CASCADED CHECK OPTION的视图不同,MySQL检查所有依赖视图的规则。

请注意,在MySQL 5.7.6之前,如果您使用带有WITH LOCAL CHECK OPTION的视图,MySQL只会检查当前视图的规则,并且不会检查底层视图的规则。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



730 次浏览
6次
 捐助