说明
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器有利有弊,利在于在某些场景下使用非常便利,比如日志备份、状态修改等;弊在于使用不当容易造成性能问题甚至死锁。
本篇简单介绍基础写法,利弊可根据使用场景、参考其他文档。
介绍
主要功能:
1、在插入或更新数据之前对数据进行检查并验证删除和更新
2、充当数据过滤器,在插入或更新之前修改超出范围的数据
3、 修改 INSERT 、 UPDATE 和 DELETE 的行为方式
4、对于不支持外键的存储引擎,模仿外键的行为
5、提供日志记录功能
6、自动创建汇总表
触发器事件:
BEFORE 和 AFTER
BEFORE 和 AFTER 关键字是指触发器的激活时间,相对于数据修改语句( INSERT 、 UPDATE 或 DELETE )将更改写入底层数据库的时间。
BEFORE 关键字可使触发器在涉及的数据修改之前执行。可使用 BEFORE 触发器捕获无效数据条目并在写入表之前对其进行更正或拒绝。
– BEFORE INSERT :在添加新数据之前触发
– BEFORE UPDATE :在使用新数据更新(或覆盖)现有数据之前触发
– BEFORE DELETE :在删除数据之前触发
AFTER 关键字定义在数据修改成功后执行的触发器。可使用 AFTER 触发器记录或审计数据库中的数据修改。
– AFTER INSERT :在添加新数据之后触发
– AFTER UPDATE :在使用新数据更新(或覆盖)现有数据之后触发
– AFTER DELETE :在删除数据之后触发
编写举例
拷贝日志表到日志备份表
-- 自定义声明 /endAll/是结束,防止在命令行中,每行单独执行
delimiter /endAll/
DROP TRIGGER IF EXISTS copySystemLogToBakTable;
CREATE TRIGGER copySystemLogToBakTable
-- insert之后触发执行
AFTER INSERT ON system_log FOR EACH ROW
BEGIN
-- new是新添加的记录标识
insert into system_log_bak(id, create_time, deleted, update_time, versions, ip, log_type, message, result, user_code, username) values (new.id, new.`create_time`, new.deleted, new.update_time, new.versions, new.ip, new.log_type, new.message, new.result, new.user_code, new.username);
END
/endAll/
delimiter ;