【MySQL】视图 —— 检查选项(LOCAL)

本地。

我们先来看一组示例,通过这组示例来解释一下local这个选项的含义。

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

当我们往v2视图插入数据时,由于我们在v2视图创建的时候定义了检查选项,所以此时他会去检查条件。

检查v2的条件没问题,此时它还要去检查v1的条件,如果v1定义的有条件,要去判定我当前所操作的数据是否满足v1的条件;如果v1里面没有定义条件,则不检查。

也就是说它也会递归找到它所依赖的视图,然后要去看这个依赖的视图中在定义的时候有没有添加检查选项,如果有,进行校验;如果没有,则不进行校验,当前这是基于MySQL8.0的效果。

image-20240719101102906
-- 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');
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值