通过示例和清楚的说明帮助,了解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
);
SQL
接下来,基于t1
表创建一个名为v1
的视图,以选择值大于10
的行记录。
CREATE OR REPLACE VIEW v1
AS
SELECT
c
FROM
t1
WHERE
c > 10;
SQL
因为没有指定WITH CHECK OPTION
,所以以下语句即使不符合v1
视图的定义也可以工作。
INSERT INTO v1(c) VALUES (5);
SQL
然后,基于v1
视图创建v2
视图。在v2
视图中添加一个WITH CASCADED CHECK OPTION
子句。
CREATE OR REPLACE VIEW v2
AS
SELECT
c
FROM
v1
WITH CASCADED CHECK OPTION;
SQL
现在,通过v2
视图在t1
表中插入一个值为5
的行。
INSERT INTO v2(c) VALUES (5);
SQL
MySQL发出以下错误消息:
Error Code: 1369. CHECK OPTION failed 'testdb.v2'
SQL
它失败了,因为它创建一个不符合v2
视图定义的新行。
之后,我们再创建一个基于v2
的名为v3
的新视图。
CREATE OR REPLACE VIEW v3
AS
SELECT
c
FROM
v2
WHERE
c