mysql触发器是附着在表上的数据库对象,当表上发生指定事件时,会自动执行预设的SQL逻辑,常用于数据校验、操作审计、关联数据同步等场景。mysql触发器的分类主要基于触发时机和触发事件两个维度。

按触发时机分类
触发时机指的是触发器在指定事件执行前还是执行后触发,mysql支持两种触发时机:
1. BEFORE触发器
BEFORE触发器会在触发事件执行之前触发,常用于数据校验、数据预处理场景。比如在插入数据前校验字段是否符合规则,不符合则阻止操作执行。
2. AFTER触发器
AFTER触发器会在触发事件执行之后触发,常用于操作日志记录、关联表数据同步场景。比如插入用户数据后,自动在用户日志表中记录新增操作。
按触发事件分类
触发事件指的是触发触发器执行的表操作类型,mysql支持三种触发事件:
1. INSERT触发器
当对表执行INSERT操作时触发,无论是单条插入还是批量插入,只要发生插入操作就会触发对应的INSERT触发器。
2. UPDATE触发器
当对表执行UPDATE操作时触发,更新单条或多条数据都会触发对应的UPDATE触发器。
3. DELETE触发器
当对表执行DELETE操作时触发,删除单条或多条数据都会触发对应的DELETE触发器。
触发器组合类型
结合触发时机和触发事件,mysql触发器总共有6种组合类型,具体对应关系如下:
| 触发时机 | 触发事件 | 完整类型 |
|---|---|---|
| BEFORE | INSERT | BEFORE INSERT |
| BEFORE | UPDATE | BEFORE UPDATE |
| BEFORE | DELETE | BEFORE DELETE |
| AFTER | INSERT | AFTER INSERT |
| AFTER | UPDATE | AFTER UPDATE |
| AFTER | DELETE | AFTER DELETE |
触发器创建示例
下面给出两种常见触发器的创建示例,帮助理解不同触发器的用法。
BEFORE INSERT触发器示例
创建一个用户表,插入数据前校验用户年龄是否大于18,小于18则阻止插入:
-- 创建用户表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT NOT NULL
);
-- 创建BEFORE INSERT触发器
DELIMITER //
CREATE TRIGGER before_user_insert
BEFORE INSERT ON user
FOR EACH ROW
BEGIN
-- 校验年龄是否小于18
IF NEW.age < 18 THEN
-- 抛出错误阻止插入
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '用户年龄必须大于等于18';
END IF;
END //
DELIMITER ;
-- 测试插入,年龄小于18会报错
INSERT INTO user (name, age) VALUES ('张三', 16);
AFTER INSERT触发器示例
创建一个用户操作日志表,用户表插入数据后自动记录新增日志:
-- 创建用户操作日志表
CREATE TABLE user_log (
log_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
operation VARCHAR(20) NOT NULL,
create_time DATETIME NOT NULL
);
-- 创建AFTER INSERT触发器
DELIMITER //
CREATE TRIGGER after_user_insert
AFTER INSERT ON user
FOR EACH ROW
BEGIN
-- 插入操作日志
INSERT INTO user_log (user_id, operation, create_time)
VALUES (NEW.id, '新增用户', NOW());
END //
DELIMITER ;
-- 测试插入,会自动生成日志
INSERT INTO user (name, age) VALUES ('李四', 20);
-- 查询日志表会看到对应记录
SELECT * FROM user_log;
触发器使用注意事项
- 每个表每个事件每个时机只能创建一个触发器,比如user表已经存在BEFORE INSERT触发器,不能再创建同类型的触发器。
- 触发器内部不能使用返回结果集的语句,比如SELECT语句不能直接返回结果,只能将结果赋值给变量。
- 触发器执行会占用一定的数据库资源,过多使用触发器可能会影响数据库性能,建议合理评估使用场景。
- 在触发器中可以使用NEW关键字获取插入或更新后的新数据,使用OLD关键字获取更新或删除前的旧数据,INSERT触发器没有OLD,DELETE触发器没有NEW。
总结:mysql触发器按触发时机分为BEFORE和AFTER两类,按触发事件分为INSERT、UPDATE、DELETE三类,组合起来总共有6种不同的触发器类型,开发者可以根据业务需求选择合适的类型进行创建和使用。