触发器概述
触发器是与表有关的数据库对象、指在insert/update/delete之前或者之后、触发并执行触发器中定义的SQL语句集合、触发器的这种特性可以协助应用在数据库端确保数据的完整性、日志记录、数据校验等操作。
使用别名OLD和NEW来引用触发器中发生变化的记录内容、这与其他的数据库是相似的、现在触发器还只支持行级触发、不支持语句级触发。
触发类型 | NEW和OLD的使用 |
---|---|
INSERT 型触发器 | NEW表示将要或者以及新增的数据 |
UPDATE型触发器 | OLD表示修改之前的数据、 |
DELETE型触发器 | OLD表示将要或者已经删除的数据 |
触发器语法
创建触发器
CREATE trigger trigger_name
before / after / insert / update / delete
on tbl_name
[ for each row ]
begin
trigger_stmt;
end;
需求
通过触发器记录 emp 表的数据变更日志、包含增加、修改、删除等。
首先创建一张表
CREATE TABLE emp_logs(
id int(11) not null auto_increment,
operation varchar(20) not null,
operate_time datetime not null,
operate_id int(11) not null,
operate_params varchar(500),
primary key (`id`)
)engine=innodb default charset=utf8;
新增
CREATE TRIGGER emp_insert_trigger
after insert
on emp
for each row
begin
insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
values(null,'insert',now(),new.id,concat('插入后 id: ',new.id,' name: ',new.`name`,' age: ',new.age,'salary',new.salary));
end
insert into emp(id,name,age,salary)
values(null,'光明左使',30,3500)
select * from emp_logs
1 insert 2022-11-07 21:06:39 5 插入后 id: 5 name: 光明左使 age: 30salary3500
修改
CREATE TRIGGER emp_update_trigger
after update
on emp
for each row
begin
insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
values(null,'insert',now(),old.id,concat('插入后 id: ',old.id,' name: ',old.`name`,' age: ',old.age,'salary',old.salary));
end
insert into emp(id,name,age,salary)
values(null,'光明右使',30,3500)
表格
2 insert 2022-11-07 21:10:24 6 插入后 id: 6 name: 光明右使 age: 30salary3500
删除
CREATE TRIGGER emp_delete_trigger
after DELETE
on emp
for each row
begin
insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
values(null,'delete',now(),old.id,concat('插入后 id: ',old.id,' name: ',old.`name`,' age: ',old.age,'salary',old.salary));
end
delete from emp where id = '6'
3 delete 2022-11-07 21:20:01 6 插入后 id: 6 name: 光明右使 age: 30salary3500
查看触发器
可以通过执行 SHOW TRIGGERS 命令查看触发器的状态、语法等信息
show triggers
删除触发器
语法结构
drop trigger [schema_name.]trigger_name
如果没有指定 schema_name、默认当前数据库