如何使用 MySQL 触发器(Trigger)实现数据库任务自动化?
使用 MySQL 触发器(Trigger) 可以实现数据库任务自动化,例如:
- 自动维护审计日志;
- 自动更新统计字段;
- 数据同步;
- 自动生成时间戳;
- 约束性业务规则(更复杂的限制)等。
一、什么是 MySQL 触发器?
触发器是一种特殊的存储对象,在指定表的 INSERT、UPDATE 或 DELETE 操作发生前后自动执行一段 SQL 代码。
触发器执行时间分两类:
| 触发时间 | 描述 |
|---|---|
| BEFORE | 在 SQL 操作执行之前触发 |
| AFTER | 在 SQL 操作执行之后触发 |
触发事件类型包括:
- INSERT
- UPDATE
- DELETE
二、语法结构
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- 执行的 SQL 语句块
END;
三、常用触发器示例
示例 1:自动记录用户变更日志
场景:对 users 表的更新操作,记录到 user_logs 日志表中。
-- 1. 创建日志表
CREATE TABLE user_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
old_email VARCHAR(100),
new_email VARCHAR(100),
changed_at DATETIME
);
-- 2. 创建触发器
DELIMITER $$
CREATE TRIGGER log_user_update
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, old_email, new_email, changed_at)
VALUES (OLD.id, OLD.email, NEW.email, NOW());
END$$
DELIMITER ;
示例 2:自动更新时间戳
ALTER TABLE orders ADD COLUMN updated_at DATETIME;
DELIMITER $$
CREATE TRIGGER update_timestamp
BEFORE UPDATE ON orders
FOR EACH ROW
BEGIN
SET NEW.updated_at = NOW();
END$$
DELIMITER ;
示例 3:防止非法删除(约束业务规则)
DELIMITER $$
CREATE TRIGGER prevent_admin_delete
BEFORE DELETE ON users
FOR EACH ROW
BEGIN
IF OLD.role = 'admin' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '禁止删除管理员账户';
END IF;
END$$
DELIMITER ;
四、触发器中的 NEW 和 OLD
| 作用 | INSERT | UPDATE | DELETE |
|---|---|---|---|
NEW | ✅ | ✅ | ❌ |
OLD | ❌ | ✅ | ✅ |
NEW.column_name:新值(插入或更新之后)OLD.column_name:旧值(更新之前或删除之前)
五、注意事项
- 一个表同一类型最多有 一个 BEFORE 和一个 AFTER 的同类型触发器;
FOR EACH ROW是必须的 —— 每一行数据触发一次;- 触发器中不能使用事务控制语句(如
COMMIT,ROLLBACK); - 触发器不要过于复杂,否则会性能下降;
- 调试困难 —— 推荐在日志表记录或配合
SIGNAL报错排查; - MySQL 不支持对
VIEW或临时表创建触发器。
六、常见应用场景
| 应用场景 | 实例说明 |
|---|---|
| 数据审计 | 用户信息变更时自动记录日志表 |
| 自动维护更新时间 | 自动设置 updated_at 字段 |
| 数据自动清洗 | 在写入时统一格式化字段(如邮箱转小写) |
| 级联更新 | 订单状态变更时同步更新库存表 |
| 安全控制 | 限制删除某些关键记录,如管理员、核心配置等 |
| 统计维护 | 记录每类商品销量变动,自动更新统计表 |
七、相关官方文档与参考资料
总结
MySQL 触发器是强大的数据库自动化工具,适合用于:
- 审计与日志;
- 自动字段更新;
- 数据一致性检查与安全防护。
但也需控制复杂度、注意性能。建议:逻辑复杂时使用存储过程或应用层处理更可控。
更多详细内容请关注其他相关文章!