本地。
我们先来看一组示例,通过这组示例来解释一下local这个选项的含义。
比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图建时未指定检查选项。 则在执行检查时,只会检查v2,不会检查v2的关联视图v1。
当我们往v2视图插入数据时,由于我们在v2视图创建的时候定义了检查选项,所以此时他会去检查条件。
检查v2的条件没问题,此时它还要去检查v1的条件,如果v1定义的有条件,要去判定我当前所操作的数据是否满足v1的条件;如果v1里面没有定义条件,则不检查。
也就是说它也会递归找到它所依赖的视图,然后要去看这个依赖的视图中在定义的时候有没有添加检查选项,如果有,进行校验;如果没有,则不进行校验,当前这是基于MySQL8.0的效果。
![image-20240719101102906](https://img-blog.csdnimg.cn/img_convert/0bb3012c51cb5b2ad7d9165bd69e48cb.png)
-- local
create or replace view stu_v_4 as select id,name from student where id <= 15;
insert into stu_v_4 values(5,'Tom'); -- 可以直接插入
insert into stu_v_4 values(16,'Tom'); -- 也可以直接插入,因为v4后面并没有加上with local check option这样的检查选项,因此不会做条件检查
-- v5依赖了v4,那么接下来它在进行检查的时候,首先要看当前操作的数据是否满足v5的条件,如果满足v5的条件,还要去递归去找它所依赖的视图,这里依赖的是v4,因此它还要去找是否满足v4的条件;而由于v4在定义的时候没有指定检查选项,所以v4就不检查了;如果v4定义了检查选项,那它还要检查v4的条件
create or replace view stu_v_5 as select id,name from stu_v_4 where id >= 10 with local check option ;
insert into stu_v_5 values(13,'Tom'); -- 可以插入
insert into stu_v_5 values(17,'Tom'); -- 可以插入
create or replace view stu_v_6 as select id,name from stu_v_5 where id < 20 ;
-- 由于当前v6没有定义检查选项,所以id < 20条件不做检查;接下来它要递归的去找v5,而v5是定义了对应的检查选项,所以它要去校验是否满足v5的条件,会发现15 >= 10,满足;再往下,由于v5依赖了v4,那么此时在插入的时候还要看是否满足v4的条件,而由于v4后面没有定义检查选择,所以v4不做检查,因此这条记录也是可以插入成功的
insert into stu_v_6 values(14,'Tom');
但假如我在定义v4的时候后面增加了 with local check option
此时对于v5增加了一条数据,18 >= 10,检查v5的条件是成立的;紧接着要找v4,由于v4在定义的时候是定义了检查选项的,所以它还要去判定18是否满足v4的条件,会发现18 >= 10,不满足,所以此时在执行这条insert语句的时候将会报错。
create or replace view stu_v_4 as select id,name from student where id <= 15 with local check option;
insert into stu_v_5 values(18,'Tom');