MySQL 8.0+中Local和cascade WITH CHECK OPTION子句的区别是什么?



我在WITH CHECK选项中遇到了这两个子句,它们是LOCAL和cascade。在以前版本的MySQL中,LOCAL选项只是为自己的视图检查规则。而cascade选项则会检查其底层视图的所有视图规则。你可以在这里查看。然而,这在mysql 8.0中已经改变了,LOCAL级联将规则递归地检查到它的所有底层视图。然而,对于cascade,文档说,"对于CASCADED,视图WHERE子句被检查,然后检查递归到底层视图,将WITH CASCADED CHECK OPTION添加到它们(为了检查的目的;它们的定义保持不变),并应用相同的规则。

那么LOCAL和cascade有什么不同呢?

一个简单的例子可能会帮助我理解,因为它对我来说太混乱了。有什么地方我理解错了吗?

这是非常罕见的情况。

mysql> create table mytable (id serial primary key, x int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into mytable set x = 42;
mysql> create view v1 as select * from mytable where x < 42;

注意v1没有CHECK选项。我应该能够插入一个与视图的过滤条件不匹配的值。

mysql> insert into v1 set x = 43;
Query OK, 1 row affected (0.00 sec)

现在我创建了两个查询v1的视图,一个视图具有本地检查选项,另一个具有级联检查选项。

mysql> create view v2 as select * from v1 where x >= 42 with local check option;
mysql> insert into v2 set x = 43;
Query OK, 1 row affected (0.01 sec)

这是可以的,因为它满足v2的条件,而v1的条件仍然允许不匹配的值。检查质量仅适用于v2条件。

现在最后一个测试:

mysql> create view v3 as select * from v1 where x >= 42 with cascaded check option;
mysql> insert into v3 set x = 43;
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'

即使该值满足v3的条件,也会失败。但是因为它级联了它的check选项,所以它改变了v1的条件,这样就好像该视图是用check选项定义的一样。因此,检查的质量级联到最初没有该选项的视图。

手册中有一个例子:https://dev.mysql.com/doc/refman/8.0/en/view-check-option.html,但我认为这个例子没有抓住要点,因为在他们的情况下,v1也用CHECK选项定义。它不显示本地和级联检查选项之间的区别。

最新更新