15)触发器 通讯
1、触发事件:触发器定义了一系列操作,称为触发程序,当触发事件发生
触发器定义了一系列操作,称为触发程序,当触发事件发生时,触发程序会自动运行;格式如下:
create trigger 触发器名 触发时间 触发事件 on 表名 for each rowbegin 触发程序end;
触发时间:before、after;
(资料图片仅供参考)
触发事件:insert、update、delete;
for each now:表示行级触发器;
使用触发器实现检查约束,确保课程的人数上限 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更新为已审核了,因为我们没有对该字段进行约束,符合预期;
#查看所有触发器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 触发器;
标签:
1、触发事件:触发器定义了一系列操作,称为触发程序,当触发事件发生
1、耕地遇到征收依照土地管理法的规定征收土地的,按照被征收土地的原
1、病情分析:维a酸主要用于治疗痤疮,尤其是重度痤疮。2、使用时会有
掌上曲靖讯日前,圆通速递曲靖分公司在宣威市宝山镇第一中学举行“情系
光大保德信前一只保壳未果,又一只迷你基金要保壳,成立仅10个月,保壳,
观点网讯:5月31日,杭州市区今年第六次集中挂牌,共推出12宗涉宅地,
高考举行2023年高考全国统考将于6月7日、6月8日举行。阳光高考信息平台
5月30日,贝壳财经记者从新钢集团官微获悉,北汽集团与新钢集团签署战
[ 相关新闻 ]