MySQL 9.0 发行说明
可更新视图可以使用 WITH CHECK OPTION
子句来防止插入不符合 select_statement
中 WHERE
子句的行。它还可以防止更新符合 WHERE
子句但更新后将导致其不符合的行(换句话说,它可以防止将可见行更新为不可见行)。
在可更新视图的 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
定义。
将根据其 LOCAL
检查选项检查 v2
的插入,然后递归检查 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'