1、触发事件:
触发器定义了一系列操作,称为触发程序,当触发事件发生时,触发程序会自动运行;格式如下:
create trigger 触发器名 触发时间 触发事件 on 表名 for each row begin 触发程序 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 row begin 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 row begin 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 触发器;
标签:触发器,15,up,update,course,trigger,limit From: https://www.cnblogs.com/xuan01/p/17446579.html