数据库MySQL —— 触发器
一、介绍
触发器 是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。
现在触发器还只支持行级触发,不支持语句级触发。
二、语法
① 创建:
CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE/DELETE ON tbl_name FOR EACH ROW --行级触发器 BEGIN trigger_stmt; END;
② 查看:
SHOW TRIGGERS;
③ 删除:
DROP TRIGGER [schema_name.] trigger_name ; --如果没有指定schema_name,默认为当前数据库。
案例需求:根据指定要求定义触发器 通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表 user_logs 中,包含增加,修改,删除。
-- 触发器 -- 准备工作:日志表 user_logs create table user_logs( id int(11) not null auto_increment, operation varchar(20) not null comment 操作类型,insert/update/delete , operate_time datetime not null comment 操作时间, operate_id int(11) not null comment 操作的ID, operate_params varchar(500) comment操作参数, primary key( id) )engine=innodb default charset=utf8;
1. insert类型
-- 定义insert触发器 create trigger tb_user_insert_trigger after insert on tb_user for each row begin -- 在日志表中插入数据 insert into user_logs (id, operation, operate_time, operate_id, operate_params) VALUES(null,insert,now(),new.id,concat(插入的数据内容为: id=,new.id,name:,new.name,phone=,new.phone, email=,new.email,profession=,new.profession)); end; -- 查看触发器 show triggers ; -- 删除触发器 drop trigger tb_user_insert_trigger; -- 插入数据到tb_user insert into tb_user (id,name,phone,email,profession,age,gender,status,createtime) values (25,二皇子,18809091212,erhuangzi@163.com,软件工程,23,1,1,now());
此时,日志表中存在信息:
2. update类型
-- 定义update触发器 create trigger tb_user_update_trigger after update on tb_user for each row begin -- 在日志表中更新数据 insert into user_logs (id, operation, operate_time, operate_id, operate_params) VALUES(null,update,now(),new.id,concat (更新之前的数据为: id=,old.id,name:,old.name,phone=,old.phone, email=,old.email,profession=,old.profession, 更新之前的数据为: id=,new.id,name:,new.name,phone=,new.phone, email=,new.email,profession=+new.profession)); end; -- 查看触发器 show triggers ; -- 删除触发器 drop trigger tb_user_update_trigger; -- 更新数据 update tb_user set age = 32 where id = 23;
此时,日志表中存在信息:
3. delete类型
-- 定义delete触发器 create trigger tb_user_delete_trigger after delete on tb_user for each row begin -- 在日志表中更新数据 insert into user_logs (id, operation, operate_time, operate_id, operate_params) VALUES(null,delete,now(),old.id,concat (删除之前的数据为: id=,old.id,name:,old.name,phone=,old.phone, email=,old.email,profession=,old.profession)); end; -- 查看触发器 show triggers ; -- 删除触发器 drop trigger tb_user_delete_trigger; -- 删除数据 delete from tb_user where id = 25;
此时,日志表中存在信息: