MySQL 8.4 Reference Manual  /  ...  /  The View WITH CHECK OPTION Clause

27.5.4 视图 WITH CHECK OPTION 子句

WITH CHECK OPTION 子句可以在可更新的视图中添加,以防止插入不满足WHERE子句的行,也防止更新使得行不满足WHERE子句(换言之,它防止可见行被更新为不可见行)。

在可更新视图的WITH CHECK OPTION 子句中,LOCALCASCADED关键字确定了检查的范围,当视图定义为另一个视图时。没有给定的关键字,默认为CASCADED

WITH CHECK OPTION检查是标准兼容的:

  • 使用LOCAL,首先检查视图WHERE子句,然后对下层视图进行递归检查,并应用相同的规则。

  • 使用CASCADED,首先检查视图WHERE子句,然后对下层视图进行递归检查,并将WITH CASCADED CHECK OPTION添加到它们(用于检查目的;它们的定义保持不变),并应用相同的规则。

  • 没有检查选项时,视图WHERE子句不被检查,然后对下层视图进行递归检查,并应用相同的规则。

考虑以下表和视图的定义:

CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
WITH CHECK OPTION;
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
WITH LOCAL CHECK OPTION;
CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
WITH CASCADED CHECK OPTION;

在这里,v2v3视图是以另一个视图v1定义的。

v2的插入被检查到其LOCAL检查选项,然后检查递归到v1,并再次应用规则。v1的规则导致检查失败。v3的检查也失败:

mysql> INSERT INTO v2 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v2'
mysql> INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'