检查选项子句
本教程通过示例和清楚的说明帮助,了解WITH CHECK OPTION
子句中LOCAL
和CASCADED
之间的差异。
在进行本教程之前,应该熟悉WITH CHECK OPTION
子句。如果不是这样,可以参阅WITH CHECK OPTION子句教程来遵循确保视图的一致性。
LOCAL&CASCADED检查范围介绍
当使用WITH CHECK OPTION
子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。因为MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。
为了确定检查的范围,MySQL提供了两个选项:LOCAL
和CASCADED
。如果您没有在WITH CHECK OPTION
子句中显式指定关键字,则MySQL默认使用CASCADED
。
MySQL与CASCADC检查选项
要了解使用CASCADED CHECK OPTION
的效果,请参阅下面的例子。
首先,创建一个名为t1
的表,其中只有一个名称为:c
的列,它的数据类型为int
。
接下来,基于t1
表创建一个名为v1
的视图,以选择值大于10
的行记录。
因为没有指定WITH CHECK OPTION
,所以以下语句即使不符合v1
视图的定义也可以工作。
然后,基于v1
视图创建v2
视图。在v2
视图中添加一个WITH CASCADED CHECK OPTION
子句。
现在,通过v2
视图在t1
表中插入一个值为5
的行。
MySQL发出以下错误消息:
它失败了,因为它创建一个不符合v2
视图定义的新行。
之后,我们再创建一个基于v2
的名为v3
的新视图。
我们通过v3
视图插入一个新行到t1
表中,值为8
。
MySQL发出以下错误信息:
上面插入语句看起来符合v3
视图的定义,insert语句仍然执行失败。
这是为什么呢?
因为v3
视图取决于v2
视图,v2
视图具有WITH CASCADED CHECK OPTION
。
但是,以下插入语句能正常工作。
因为v3
视图没有使用WITH CHECK OPTION
定义,并且该语句符合v2
视图的定义。
所以,总而言之:
当视图使用WITH CASCADED CHECK OPTION
时,MySQL会循环检查视图的规则以及底层视图的规则。
MySQL WITH LOCAL CHECK OPTION
下面将演示使用 WITH LOCAL CHECK OPTION
选项,使用上面相同的示例来查看差异。
首先,将v2
视图更改为使用WITH LOCAL CHECK OPTIONS
替代。
其次,插入与上述示例相同的行。
它是可以成功执行的。
因为v2
视图没有任何规则。 v2
视图取决于v1
视图。 但是,v1
视图没有指定检查选项,因此MySQL跳过检查v1
视图中的规则。
请注意,在使用
WITH CASCADED CHECK OPTION
创建的v2
视图中,此语句失败。
第三,通过v3
视图将相同的行插入t1
表。
在这种情况下可以执行成功,因为MySQL视图中的WITH LOCAL CHECK OPTIONS
选项没有检查v1
视图的规则。 另外,请注意,在使用WITH CASCADED CHECK OPTION
创建的v2
视图示例中,此语句执行失败。
因此,如果视图使用WITH LOCAL CHECK OPTION
,MySQL会检查WITH LOCAL CHECK OPTION
和WITH CASCADED CHECK OPTION
选项的视图规则。
与使用WITH CASCADED CHECK OPTION
的视图不同,MySQL检查所有依赖视图的规则。
请注意,在MySQL 5.7.6之前,如果您使用带有
WITH LOCAL CHECK OPTION
的视图,MySQL只会检查当前视图的规则,并且不会检查底层视图的规则。
Last updated