前言
在 检查选项 一文中,提到了在向视图中添加数据,更新、删除视图中的数据时,可以使用检查选项,使这些操作更符合视图的定义。例如当我们定义了一个带有检查选项的视图 view_with_check_option
,用于查询年龄大于 18 岁的用户,这时,向视图 view_with_check_option
中添加 12 岁的小红,执行添加这条语句时会报错,最终表中也没有这条数据。
MySQL
提供了两个选项:LOCAL
和 CASCADED
。
LOCAL
和 CASCADED
- 当视图使用
WITH CASCADED CHECK OPTION
时,MySQL
会循环检查视图的规则以及底层视图的规则; LOCAL
检查选项是递归的查找当前视图所依赖的视图是否有检查选项,如果有,则检查;如果没有,就不做检查。
例子
通过一个例子来说明这两个检查选项之间的区别:
用户表如下:
先创建查找所有年龄大于等于 30 的用户的视图 user_age_gte_30
,不带检查选项。
基于视图 user_age_gte_30
,创建查找年龄小于等于 40 的用户的视图 user_age_lte_40_cascaded
,带 WITH CASCADED CHECK OPTION
子句;
向视图 v_user_age_lte_40_cascaded
中添加三条数据:
- 20 岁的 Alex;
- 35 岁的 Cat;
- 50 岁的 Bob。
最后的结果是,只有 35 岁的 Cat 这条数据被成功地添加到了用户表中。也就是说视图 v_user_age_lte_40_cascaded
的检查范围是大于等于 30 小于等于 40 这个区间。视图 user_age_gte_30
是不带检查选项的,但是级联(cascaded)会使视图 v_user_age_lte_40_cascaded
所依赖的其他的视图 user_age_gte_30
也带上检查选项。
基于视图 user_age_gte_30
,创建查找年龄小于等于 40 的用户的视图 user_age_lte_40_local
,带 WITH LOCAL CHECK OPTION 字句
;
向视图 v_user_age_lte_40_local
中添加三条数据:
- 24 岁的 David;
- 34 岁的 Cherry;
- 44 岁的 Emmy。
最终,24 岁的 David 和 34 岁的 Cherry 都被添加到了数据库中,只有大于 40 的 Emmy 这条数据添加失败。也就是说视图 v_user_age_lte_40_local
的检查范围是小于等于 40 这个区间。LOCAL
选项会先检查当前视图的范围,再去检查所依赖视图是否有检查选项,如果有则检查,如果没有则不检查所依赖视图的检查范围。在这里 user_age_gte_30
视图不带检查选项,所以 v_user_age_lte_40_local
视图的检查范围是小于等于 40。但是如果视图 user_age_gte_30
有检查选项,检查范围又是如何呢?答案是 [30, 40],和视图 v_user_age_lte_40_cascaded
的检查范围是一样的。
总结
- 若当前视图带有
CASCADED
检查选项,那么所依赖的视图就会带上检查选项; - 若当前视图带有
LOCAL
检查选项,那么就会检查所依赖的视图有没有检查选项,如果有就会检查所依赖的视图,没有就不检查;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。