MySQL 8.0 参考手册  / 第25章存储对象  / 25.5 使用视图  /  23.5.4 WITH CHECK OPTION 子句的视图

23.5.4 WITH CHECK OPTION 子句的视图

WITH CHECK OPTION可以为可更新视图提供该子句,以防止插入到 子句WHEREselect_statement正确的行。它还会阻止更新WHERE 子句为真但更新会导致它不为真的行(换句话说,它会阻止可见行更新为不可见行)。

WITH CHECK OPTION可更新视图的子句中,LOCALCASCADED 关键字确定根据另一个视图定义视图时检查测试的范围。当两个关键字都没有给出时,默认为CASCADED.

在 MySQL 5.7.6 之前,WITH CHECK OPTION测试是这样的:

  • 使用LOCAL,检查视图 WHERE子句,但不检查基础视图。

  • 使用CASCADED,检查视图 WHERE子句,然后检查递归到基础视图,添加WITH CASCADED CHECK OPTION到它们(为了检查的目的;它们的定义保持不变),并应用相同的规则。

  • 如果没有检查选项,则不检查视图WHERE子句,也不检查基础视图。

从 MySQL 5.7.6 开始,WITH CHECK OPTION测试是符合标准的(更改了以前的 for 语义 LOCAL并且没有检查子句):

  • 使用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。在 MySQL 5.7.6 之前,因为v2LOCAL检查选项,所以插入只针对v2检查进行测试。v3有一个CASCADED检查选项,所以插入不仅要针对v3检查进行测试,还要针对底层视图进行测试。以下陈述说明了这些差异:

mysql> INSERT INTO v2 VALUES (2);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'

从 MySQL 5.7.6 开始,for 的语义与以前不同:根据其检查选项检查LOCAL 插入 for ,然后(与 5.7.6 之前不同),检查递归到 并再次应用规则。导致检查失败的规则 。检查 失败像以前一样: v2LOCALv1v1v3

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'