我在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选项定义。它不显示本地和级联检查选项之间的区别。