1. 概述

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插 入,更新,删除,以使其符合视图的定义。 MySQL允许基于另一个视图创建视图,它还会检查依赖视 图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项: CASCADED 和 LOCAL ,默认值为 CASCADED 。

2. 初始化脚本

create table student(
    id   int auto_increment comment '主键ID' primary key,
    name varchar(10) null comment '姓名',
    no   varchar(10) null comment '学号'
)comment '学生表';

3. CASCADED

比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1。

如下五条SQL:

  • 创建视图
create view v1 as select id,name from student where id < 15;
create view v2 as select id,name from v1 where id >10;
create view v3 as select id,name from v2 where id <30 with cascaded check option;
create view v4 as select id,name from v3 where id > 5 and id < 14;
  • 执行插入语句
  • 插入第一条数据,满足所有条件
mysql> insert into v4 values(12,'jack');
Query OK, 1 row affected (0.00 sec)
  • 插入第二条数据,不满足v4,其他都满足
mysql> insert into v4 values(14,'jack');
Query OK, 1 row affected (0.00 sec)

通过上面的示例,我们知道并没有对视图v4进行校验。

  • 插入第三条数据,不满足v3
mysql> insert into v4 values(40,'jack');
ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4'
  • 插入第四条数据,满足v3,不满足v2。
mysql> insert into v4 values(10,'jack');
ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4'

即使v2没有加语句with cascaded check option,也照样进行条件的检查,这也是级联检查的含义。

  • 插入第五条数据,满足v3、v2,不满足v1
mysql> insert into v4 values(20,'jack');
ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4'

级联检查条件,他会一直往上检查,直到关联到真实的表数据。

3 LOCAL

本地。

比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创 建时未指定检查选项。 则在执行检查时,知会检查v2,不会检查v2的关联视图v1。

  • 创建视图
create view v1 as select id,name from student where id < 15;
create view v2 as select id,name from v1 where id >10;
create view v3 as select id,name from v2 where id <30 with local check option;
create view v4 as select id,name from v3 where id > 5 and id < 14;
  • 执行插入语句
  • 插入第一条数据,满足所有条件
insert into v4 values(12,'jack');
Query OK, 1 row affected (0.00 sec)
  • 插入第二条数据,不满足v4,其他都满足
insert into v4 values(14,'jack');
Query OK, 1 row affected (0.00 sec)
  • 插入第三条数据,不满足v3。
insert into v4 values(40,'jack');
ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4'
  • 插入第四条数据,满足v3,不满足v2。
mysql> insert into v4 values(10,'jack');
Query OK, 1 row affected (0.00 sec)

这里同cascaded 的区别展现出来了,对于他引用的视图,如果没有填写检查选项,那么这个视图就不会做检查选项。

4. CASCADED与LOCAL

通过上面的实验我们知道CASCADED它会对所有它引用的父辈、祖父辈视图做级联检查,这个实验主要验证如果他关联的视图链表中如果有一个出现local,那么他后面的视图还是否继续检查选项。

  • 创建视图
create view v1 as select id,name from student where id < 15;
create view v2 as select id,name from v1 where id >10 with local check option;
create view v3 as select id,name from v2 where id <30;
create view v4 as select id,name from v3 where id > 5 with cascaded check option;
  • 执行插入语句
    通过上面的示例,我们很快能判断如果不满足视图v4或者v3,都会终止插入数据,所以我们这里主要验证v2和v1的条件。
  • 插入第一条数据,不满足v2条件
mysql> insert into v4 values(8,'jack');
ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4'
  • 插入第二条数据,不满足v1,其他都满足
mysql> insert into v4 values(20,'jack');
ERROR 1369 (HY000): CHECK OPTION failed 'surpass.v4'

仍然报错,也就是说只要由cascaded染指,那么他上面的local将变成鸡肋,没有什么大用处了。