介绍
触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,出发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端保证数据的完整性,日志记录,数据校验等操作。
使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还支持行级出发,不支持语句级出发。
| 触发器类型 | NEW 和 OLD |
|---|---|
| INSERT 型触发器 | NEW 表示将要或者已经新增的数据 |
| UPDATE型触发器 | OLD表示修改之前的数据,NEW表示将要修改或已经修改的数据。 |
| DELETE型触发器 | OLD表示将要或者已经删除的数据 |
触发器语法
创建
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 ,默认删除当前数据库下的 trigger_name 触发器
例子:
给tb_user 表添加 insert触发器,在数据新增后记录到 tb_user_logs 表中
tb_user 表机构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`id` int(0) NOT NULL COMMENT '唯一id',
`uage` int(0) NULL DEFAULT NULL COMMENT '年龄',
`profession` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '专业',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
tb_user_logs 表结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `tb_user_logs`;
CREATE TABLE `tb_user_logs` (
`id` int(0) NOT NULL COMMENT '自增数据id',
`operation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作类型',
`uage` int(0) NULL DEFAULT NULL COMMENT '年龄',
`profession` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '专业',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
`operate_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'tb_user表操作记录表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
创建触发器
-- 创建插入触发器
create trigger tb_user_insert_trigger
-- after 定义新增后执行触发器记录新增记录
after insert on tb_user for each row
begin
insert into tb_user_logs(id,operation,uage,profession,name,operate_time)
-- 通过 new.id 获取新增的id、uage、name等信息
values(new.id,'insert',new.uage,new.profession,new.name,now());
end;
-- 查看触发器
show triggers;
-- 删除触发器
drop trigger tb_user_insert_trigger;
更新触发器例子,记录 tb_user 表的更新记录,记录更新之前的旧数据,同时也可以通过 new 记录更新后的数据,或更新前更新后的数据都进行记录
-- 创建更新触发器
create trigger tb_user_update_trigger
-- after 定义更新后执行触发器记录修改前的数据记录
after update on tb_user for each row
begin
insert into tb_user_logs(id,operation,uage,profession,name,operate_time)
-- 通过 old.id 获取旧的id、uage、name等信息,同时也可以通过new 获取更新后的数据进行记录
values(old.id,'update',old.uage,old.profession,old.name,now());
end;
-- 查看触发器
show triggers;
-- 删除触发器
drop trigger tb_user_insert_trigger;
删除触发器的例子,记录 tb_user 表的删除记录,记录数据删除前的数据。
-- 创建删除触发器
create trigger tb_user_delete_trigger
-- after 定义更新后执行触发器记录修改前的数据记录
after delete on tb_user for each row
begin
insert into tb_user_logs(id,operation,uage,profession,name,operate_time)
-- 通过 old.id 获取旧的id、uage、name等信息
values(old.id,'delete',old.uage,old.profession,old.name,now());
end;
-- 查看触发器
show triggers;
-- 删除触发器
drop trigger tb_user_insert_trigger;
注意:转载请携带文章源地址