1 触发器定义与核心特性
触发器(Trigger) 是 MySQL 中一种与表事件绑定的特殊存储过程,当特定事件(如 INSERT
、UPDATE
、DELETE
)发生在某个表上时,触发器会自动执行预定义的 SQL 逻辑。它常用于实现以下场景:
- 数据校验与约束
- 自动填充字段
- 级联操作(如同步更新关联表)
- 审计与日志记录
核心特性:
- 事件驱动:由
INSERT
、UPDATE
、DELETE
事件触发。 - 表级绑定:每个触发器关联到特定表。
- 自动执行:无需手动调用,由数据库自动触发。
- 事务性:触发器的执行与原始操作在同一个事务中。
2 触发器的类型
MySQL 支持以下 6 种触发器类型:
触发器类型 | 触发时机 | 说明 |
---|---|---|
BEFORE INSERT | 数据插入前 | 检查或修改即将插入的数据 |
AFTER INSERT | 数据插入后 | 记录日志或执行后续操作 |
BEFORE UPDATE | 数据更新前 | 校验或调整即将更新的数据 |
AFTER UPDATE | 数据更新后 | 同步其他表或记录变更历史 |
BEFORE DELETE | 数据删除前 | 阻止删除或备份数据 |
AFTER DELETE | 数据删除后 | 级联删除关联数据或清理资源 |
3 触发器示例
3.1 示例 数据校验触发器
场景:确保 employees
表中 salary
字段不为负数。
实现代码:
DELIMITER
$$CREATE TRIGGER check_salary_before_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGINIF NEW.salary < 0 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '薪资不能为负数';END IF;
END
$$DELIMITER ;
说明:
- BEFORE INSERT:在插入数据前触发。
- FOR EACH ROW:对每一行受影响的数据执行逻辑。
- NEW.salary:引用即将插入的新记录的 salary 字段。
3.2 示例 自动更新关联表
场景:当 orders 表插入新订单时,自动更新 customers 表的 last_order_date 字段。
实现代码:
DELIMITER $$
CREATE TRIGGER update_customer_last_order
AFTER INSERT ON orders
FOR EACH ROW
BEGINUPDATE customers SET last_order_date = NOW()WHERE customer_id = NEW.customer_id;
END $$
DELIMITER ;
说明:
- AFTER INSERT:在订单插入后触发。
- NEW.customer_id:引用新插入订单的 customer_id。
3.3 示例 阻止删除关键数据
场景:防止删除 products 表中 is_active = 1 的商品。
实现代码:
复制代码
DELIMITER $$
CREATE TRIGGER prevent_delete_active_product
BEFORE DELETE ON products
FOR EACH ROW
BEGINIF OLD.is_active = 1 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '不能删除激活状态的商品';END IF;
END $$
DELIMITER ;
说明:
- BEFORE DELETE:在删除操作前触发。
- OLD.is_active:引用即将被删除记录的 is_active 字段。
4 触发器的管理命令
查看所有触发器:
SHOW TRIGGERS;
查看特定表触发器:
SHOW TRIGGERS FROM your_database_name LIKE 'your_table_name';
删除触发器:
DROP TRIGGER IF EXISTS your_trigger_name;
5 注意事项
- 性能影响:频繁触发的复杂逻辑可能影响数据库性能。
- 递归触发:避免触发器操作触发其他触发器,导致死循环。
- 权限要求:需具备 TRIGGER 权限才能创建或修改触发器。
- 调试难度:触发器隐式执行,错误排查需依赖日志或调试工具。
6 典型应用场景
- 数据完整性约束:强制业务规则(如唯一性、范围校验)。
- 审计与日志:记录关键操作历史(如用户修改时间、内容)。
- 同步数据:自动更新冗余字段或关联表(如缓存统计值)。
- 级联操作:实现复杂的级联删除或更新逻辑。
通过合理使用触发器,可以显著提升数据库的自动化管理能力,但需谨慎设计以避免潜在的性能和逻辑问题。