1、定义:触发器(trigger),在SQL执行insert、update、delete等DML语句时,自动执行的一组SQL语句,不能主动执行。
如每次delete时都要insert到备份表中:
# 定义触发器
#before delete代表 在delete之前触发
create trigger tr_delete before delete on employee
for each row#每一行都是相同设置
begin
#insert语句
end;
# 当执行delete语句时,则触发了触发器,执行触发器代码
delete from employee where id=101;
2、触发器的类型,按触发时间点不同分为:
1)前触发器:在执行insert、update、delete等DML语句之前自动执行。
2)后触发器:在执行insert、update、delete等DML语句之后自动执行。
3、创建前触发器,用法如下:
#对employee表的salary字段进行更新前,判断salary小于0,需要显示消息
#on employee说明触发器属于employee表
#for each row对于表中任意一行数据都会触发
create trigger tr_update before update on employee
for each row
begin
#触发器中根据需要可以使用old、new关键字分别存放更新前和更新后的全部数据
if new.salary<0 then
#手动抛出异常,异常代码是45000,显示错误信息是salary小于0
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='An error occurred';
end if;
end;
-- 验证触发器
update employee set salary=-1 where id=101;
4、创建后触发器,用法如下:
#创建后触发器,在添加之后执行
create trigger tr_insert after insert on employee
for each row
begin
if new.salary>10000 then
signal sqlstate '45000' set MESSAGE_TEXT='An error occurred';
end if;
end;
-- 验证触发器
insert into employee(id,salary) values(131,20000);
5、删除触发器:
drop trigger tr_delete;
6、注意:Mysql的同一张表中不支持相同的触发时间点(before...)和触发事件(insert...)的触发器。