最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

15)触发器

来源:博客园

1、触发事件:

触发器定义了一系列操作,称为触发程序,当触发事件发生时,触发程序会自动运行;格式如下:

create trigger 触发器名 触发时间 触发事件 on 表名 for each rowbegin    触发程序end;

触发时间:before、after;


(相关资料图)

触发事件:insert、update、delete;

for each now:表示行级触发器;

2、使用触发器实现检查约束:

使用触发器实现检查约束,确保课程的人数上限 up_limit 字段值在(60,150,230)范围内;

delimiter $$create trigger insert_before_course_trigger before insert on course for each rowbegin    if new.up_limit not in(60,150,230) then     signal sqlstate "ERROR" set message_text = "选修人数上限只能在60、150、230之间取值"; #引发错误方式    end if;end;$$delimiter ;

new获取新值的标识符;old获取原值的标识符;使用格式:

new.字段 或 old.字段 

signal sqlstate 为引发错误的方式;

执行下列测试语句;

insert into course values(null,"音乐鉴赏",100,"暂无",default,"005");

发现会报错;而且正是我们在signal那行所设定的 message_text 的值;原因在于我们设定的触发器就是让 up_limit 的值只能三选一;不能自定;

执行下列测试语句:

insert into course values(null,"音乐鉴赏",150,"暂无",default,"005");

发现可以成功插入;

到此,我们执行update语句结果会怎么样呢?执行下列测试语句:我们更新course_no= 5 的up_limit的值:

update course set up_limit=100 where course_no = 5;

发现成功update,这与我们设定的up_limit 的值不符合;那么我们如何修正呢?

那就是我们设定一个 update 的触发器;我们让其变更为原值;

delimiter $$create trigger update_before_course_trigger before update on course for each rowbegin    if new.up_limit not in(60,150,230) then     set new.up_limit = old.up_limit;    end if;end;$$delimiter ;

那么我们将执行下列测试语句,修改为符合值;

update course set up_limit=150 where course_no = 5;

可以发现我们可以修改为符合的值;再测试一下我们将其更新为不符合的值:

update course set up_limit=100 where course_no = 5;

可以看到虽然我们匹配找到了一行,但是changed为0,就是未作update操作;

至此,我们的insert触发器和update触发器就完成了,维持 up_limit 的值只能在三选一;

我们可以再测试一下,当我们同时修改其他字段时:

update course set up_limit=100, status="已审核" where course_no = 5;

可以发现,我们的up_limit 字段未作修改,但是status更新为已审核了,因为我们没有对该字段进行约束,符合预期;

3、查看和删除触发器:

#查看所有触发器show triggers\G
#查看指定触发器名show create trigger 触发器名\G
show create trigger insert_before_course_trigger\G

貌似MySQL8.0版本之后不支持下列模糊查看了:

show trigger like "%trigger"\G

通过查询GPT,可以使用以下方法:

select * from information_schema.triggers where trigger_name like "%\_trigger"\G

查询information_schema下的triggers表,通过匹配名字进行模糊查找;

删除触发器命令:

#删除触发器drop trigger 触发器;

关键词: