目录
参考大佬:MySQL之触发器_mysql触发器-CSDN博客
触发器:在增删改之前或之后,触发并执行触发器中定义的SQL语句。
触发器:MySql只支持行级触发器,不支持语句级触发器。
行级触发器:如执行一条update语句,影响了5行,触发器会被出发5次。
语句级触发器:如执行一条update语句,不管影响了多少行,触发器都只触发1次。
触发器类型及语法
类型
- 在UPDATE和DELETE触发器中:
OLD
关键字用于引用更新或删除操作之前的行版本。对于UPDATE操作,你可以通过OLD.column_name
来访问被更新之前的列的值;对于DELETE操作,OLD
关键字允许你访问被删除行的列的值。 - 在INSERT触发器中:
OLD
关键字没有意义,因为INSERT操作是向表中添加新行,而不涉及任何已存在的行版本。
语法
查看触发器
show triggers
创建触发器
create trigger {触发器名称}
{before | after } {insert | update | delete} -- 触发器类型和事件
on 表名
for each row -- 行级触发器-触发器的作用范围
begin
-- 编写触发器执行的逻辑
end;
删除触发器
drop trigger 触发器名称;
#案例
通过触发器记录tb_user表的数据变更日志(增删改),将变更日志插入到日志表user_logs
#日志表结构
create table user_logs(
id int(11) ;
操作类型 varchar(20),
时间 datetime,
操作id int(11),
操作参数 varchar(500),
primary key(`id`)
)engine=innodb default charset=utf8;
分析:因为对于增删改都需要触发,所以需要定义三个触发器
insert类型触发器
create trigger {随便起个触发器名}
after insert
on tb_user
for each row
begin
insert into user_logs(id,操作类型,时间,操作id,操作参数)
values(null,"insert",now(),new.id,concat('插入的数据内容为:
id=',new.id,',name=',new.name,
',phone=',new.phone,',email=' ,new.email))
end;
#效果:当插入user表数据时,会触发触发器并增加到logs日志表中。
update类型触发器
create trigger {随便起个触发器名}
after update
on tb_user
for each row
begin
update user_logs(id,操作类型,时间,操作id,操作参数)
values(null,"update",now(),new.id,
concat('更新之前为: id=',old.id,',name=',old.name, ',phone=',old.phone,',email=' ,old.email,
'更新之后为: id=',new.id,',name=',new.name, ',phone=',new.phone,',email=' ,new.email))
end;
#效果:当更改user表数据时,就会记录到logs日志表中。
update类型触发器
create trigger {随便起个触发器名}
after delete
on tb_user
for each row
begin
delete user_logs(id,操作类型,时间,操作id,操作参数)
values(null,"delete",now(),new.id,
concat('删除之前的数据为: id=',old.id,',name=',old.name, ',phone=',old.phone,',email=' ,old.email))
end;
#效果:当删除user表数据时,就会记录到logs日志表中。