15)触发器

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 触发器;

 

posted @ 2023-05-31 21:20  QianFa01  阅读(32)  评论(0编辑  收藏  举报