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将变成鸡肋,没有什么大用处了。