本文最后更新于 319 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
MySQL触发器
一、触发器介绍和语法
1.1 触发器介绍
触发器是与表相关的数据库对象,指在增删改之前或之后,触发并执行触发器中定义的SQL语句集合。
触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名New和Old来引用触发器中发生变化的记录内容,这与其他数据库是相似的。现在触发器还只支持行级
触发,不支持语句级触发。
触发器类型 | New和Old |
---|---|
insert型触发器 | New表示将要或已经新增的数据 |
update型触发器 | Old表示修改之前的数据,New表示将要或已经修改后的数据 |
delete型触发器 | Old表示将要或已经删除的数据 |
1.2 语法
创建触发器:
create trigger trigger_name
before/after insert/update/delete
on tb_name for each row --行级触发器
begin
trigger_stmt; --触发器具体逻辑
end;
查看触发器:
show triggers;
删除触发器:
drop trigger [schema_name.]trigger_name; --如果没有指定schema_name,默认为当前数据库
二、触发器案例
2.1 Insert触发器
案例(Insert类型):通过触发器记录tb_user表的数据变更日志,将变更日志插入到日志表user_logs中,包含增删改。
-- 创建日志表
create table user_logs(
id int not null primary key auto_increment,
operation varchar(20) not null comment '操作类型,增删改',
operation_time datetime not null comment '操作时间',
operation_id int not null comment '操作ID',
operation_params varchar(50) comment '操作参数'
)engine = innodb default charset =utf8;
-- 创建触发器
create trigger tb_user_insert_trigger
after insert on user for each row
begin
insert into user_logs(id, operation, operation_time, operation_id, operation_params)
values (null,'insert',now(),new.id,concat('插入数据内容为:id=',new.id,',name=',new.name,',age=',new.age,',gender=',new.gender,',profession=',new.profession));
end;
2.2 Update触发器
create trigger tb_user_update_trigger
after update on user for each row
begin
insert into user_logs(id, operation, operation_time, operation_id, operation_params)
values (null,'update',now(),new.id,concat('跟新前数据内容为:id=',old.id,',name=',old.name,',age=',old.age,',gender=',old.gender,',profession=',
old.profession,'|跟新后数据内容为:id=',new.id,',name=',new.name,',age=',new.age,',gender=',new.gender,',profession=',new.profession));
end;
2.3 Delete触发器
create trigger tb_user_delete_trigger
after delete on user for each row
begin
insert into user_logs(id, operation, operation_time, operation_id, operation_params)
values (null,'delete',now(),old.id,concat('删除前数据内容为:id=',old.id,',name=',old.name,',age=',old.age,',gender=',old.gender,',profession=',old.profession));
end;