MySQL 8.3 Release Notes
该 WITH CHECK OPTION 子句可以用于可更新视图,以防止插入不满足 WHERE 子句的行的插入。它还防止更新使得 WHERE 子句为 true 的行变为不 true 的行(换言之,防止可见行被更新为不可见行)。
在可更新视图的 WITH CHECK OPTION 子句中,LOCAL 和 CASCADED 关键字确定视图定义时的检查范围。当没有给出关键字时,默认为 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;
这里,v2 和 v3 视图是根据另一个视图 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'