前言

检查选项 一文中,提到了在向视图中添加数据,更新、删除视图中的数据时,可以使用检查选项,使这些操作更符合视图的定义。例如当我们定义了一个带有检查选项的视图 view_with_check_option,用于查询年龄大于 18 岁的用户,这时,向视图 view_with_check_option 中添加 12 岁的小红,执行添加这条语句时会报错,最终表中也没有这条数据。

MySQL 提供了两个选项:LOCALCASCADED

LOCALCASCADED

  • 当视图使用 WITH CASCADED CHECK OPTION 时,MySQL会循环检查视图的规则以及底层视图的规则;
  • LOCAL 检查选项是递归的查找当前视图所依赖的视图是否有检查选项,如果有,则检查;如果没有,就不做检查。

例子

通过一个例子来说明这两个检查选项之间的区别:

用户表如下:
v_user.png

先创建查找所有年龄大于等于 30 的用户的视图 user_age_gte_30不带检查选项

v_user_gte_30.png

基于视图 user_age_gte_30,创建查找年龄小于等于 40 的用户的视图 user_age_lte_40_cascaded,带 WITH CASCADED CHECK OPTION 子句;

v_user_age_lte_40_cascaded.png

向视图 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.png

向视图 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 检查选项,那么就会检查所依赖的视图有没有检查选项,如果有就会检查所依赖的视图,没有就不检查;

参考

  1. MySQL local和cascaded检查选项子句
  2. MySQL 视图——检查选项(cascaded、local)

Moonshadow2333
28 声望0 粉丝

征途漫漫


« 上一篇
检查选项
下一篇 »
存储过程