一、基本概述
触发器是与表有关的数据对象,在INSERT/UPDATE/DELETE之前或者是之后,触发并执行触发器中定义的SQL语句的集合,触发器的这种特性可以在协助应用在数据库端确保数据的完整性,日志记录,数据校验等操纵。
使用别名OLD和NEW来引用触发器中发生变化的记录内容,现在的触发器只支持行级触发,不支持语句触发
。
- 行级触发:每关联一行数据都会触发。
- 语句触发:在执行这条语句时只触发一次。
二、语法结构
创建触发器
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON table_name FOR EACH ROW --- 行级触发器
BEGIN
...
END;
查看触发器
SHOW TRIGGERS;
删除触发器
DROP TRIGGER 数据库名.触发器名
三、基本使用
通过触发器记录用户表的变动
创建用户表
CREATE TABLE `tb_user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`age` int NULL DEFAULT NULL,
`sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`score` decimal(10, 2) NULL DEFAULT NULL,
`rq` date NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
创建用户日志表
CREATE TABLE `user_log` (
`id` int NOT NULL AUTO_INCREMENT,
`operation` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作类型 insert/update/delete',
`operation_time` datetime NOT NULL COMMENT '操作时间',
`operation_id` int NOT NULL COMMENT '操作ID',
`operation_params` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作参数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
3.1 新增的触发器
编写触发器
CREATE TRIGGER tb_user_insert_trigger
AFTER INSERT ON tb_user FOR EACH ROW
BEGIN
INSERT INTO user_log(operation, operation_time, operation_id, operation_params) VALUES ('insert', NOW(), new.id, CONCAT('插入的数据内容为id=', new.id, 'name=', new.name, 'age=',new.age,'sex=',new.sex,'score=',new.score,'rq=',new.rq));
END;
向用户表中插入数据,查看是否已经插入日志数据
INSERT INTO tb_user(name, age, sex, score, rq) VALUES ('测试触发器', 100, 1, 999999, NOW());
3.2 修改的触发器
编写触发器
CREATE TRIGGER tb_user_update_trigger
AFTER UPDATE ON tb_user FOR EACH ROW
BEGIN
INSERT INTO user_log(operation, operation_time, operation_id, operation_params) VALUES ('update', NOW(), new.id, CONCAT(
'更新之前的数据为id=', old.id, 'name=', old.name, 'age=',old.age,'sex=',old.sex,'score=',old.score,'rq=',old.rq,
'更新之后的数据为id=', new.id, 'name=', new.name, 'age=',new.age,'sex=',new.sex,'score=',new.score,'rq=',new.rq));
END;
修改用户数据,查看是否已经插入日志数据
UPDATE tb_user SET age=2000 WHERE id=7;
3.3 删除的触发器
编写触发器
CREATE TRIGGER tb_user_delete_trigger
AFTER DELETE ON tb_user FOR EACH ROW
BEGIN
INSERT INTO user_log(operation, operation_time, operation_id, operation_params) VALUES ('delete', NOW(), new.id, CONCAT('删除之前的数据内容为id=', old.id, 'name=', old.name, 'age=',old.age,'sex=',old.sex,'score=',old.score,'rq=',old.rq));
END;
删除用户数据,查看是否已经插入日志数据
DELETE FROM tb_user WHERE id='7';