视图的检查选项:当使用WITH CHECK OPTION
子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。 MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项:CASCADED 和 LOCAL ,默认值为 CASCADED
。
#case1 #创建一个基于students表的视图 create or replace view v1 as select id,name from students where id<=20; #由于没有检查选项,所以插入id>20的数据也会插入成功 insert into v1 values(21,'john');#插入成功 #case2 #创建一个基于v1的视图,并添加cascaded检查选项 create or replace view v2 as select id,name from v1 where id>10 with cascaded check option; #添加检查选项后,再插入数据,MySQL就会判断插入数据是否满足条件, #由于此视图是基于v1的,所以现在可以插入的id值为 10<id<=20。 insert into v2 values(22,'lucy');#插入失败 #case3 #创建一个基于v2的视图 create or replace v3 as select id,name from v2 where id<=15; #由于v3没有添加检查选项,但v3是基于v2的,所以现在可以插入的id值依然为 10<id<=20。 insert into v3 values(18,'Tom');#插入成功 insert into v3 values(24,'kobe');#插入失败
当我们操作当前视图时,cascaded检查选项是,如果当前视图有检查选项,则插入数据要满足包括当前视图条件以及满足当前视图所依赖的视图的条件。如果当前视图没有检查选项,则插入数据要满足当时视图所依赖视图有检查选项及其依赖的视图的条件。
#case1 #创建一个基于students表的视图 create or replace view v1 as select id,name from students where id<=20; insert into v1 values(21,'john');#插入成功 #case2 #创建一个基于v1的视图,并添加local检查选项 create or replace view v2 as select id,name from v1 where id>10 with local check option; #添加检查选项后,再插入数据,MySQL就会判断插入数据是否满足条件, #由于此视图是基于v1的,v1没有检查选项,所以现在可以插入的id值为 id>10。 insert into v2 values(22,'lucy');#插入成功 #case3 #创建一个基于v2的视图 create or replace v3 as select id,name from v2 where id<=15; #由于v3没有添加检查选项,但v3是基于v2的,所以现在可以插入的id值依然为 id>10。 insert into v3 values(18,'Tom');#插入成功
当我们在操作当前视图时,local检查选项是递归的查找当前视图所依赖的视图是否有检查选项,如果有,则检查;如果没有,就不做检查。