触发器是 MySQL 中事件驱动的自动执行机制,当对指定表执行 INSERT、UPDATE 或 DELETE 操作时,按行触发 BEFORE 或 AFTER 定义的 SQL 逻辑,通过 NEW/OLD 访问数据,用于校验、同步、日志等场景。

触发器是 MySQL 中一种与表紧密绑定的自动执行机制,它不是手动调用的存储过程,而是在对某张表执行 INSERT、UPDATE 或 DELETE 操作时,由数据库系统自动触发并运行的一段 SQL 逻辑。
触发器的核心原理
它的本质是“事件驱动”:当指定表上发生特定 DML 操作(增、删、改)时,MySQL 会立即检查是否存在匹配的触发器。如果存在,且满足触发时间(BEFORE 或 AFTER)、操作类型和作用表等条件,就自动执行其定义的 SQL 语句块。
触发器按行生效(行级触发),即每影响一行数据,就触发一次。内部可通过 NEW(代表新值,INSERT/UPDATE 可用)和 OLD(代表旧值,UPDATE/DELETE 可用)关键字访问当前被操作行的字段内容。
触发器的四个必要要素
- 监视表 :必须是永久基表,不能是临时表或视图
- 触发事件 :仅支持 INSERT、UPDATE、DELETE(含 LOAD DATA、REPLACE 等隐式触发场景)
- 触发时机 :BEFORE(操作前校验 / 修改)或 AFTER(操作后联动 / 记录)
- 触发动作 :一段合法 SQL,可单条,也可用 BEGIN……END 包裹多条(需提前设置 delimiter)
典型应用场景
- 数据变更前做合法性检查(如金额不能为负)
- 主表更新后自动同步更新关联表(如订单完成 → 库存扣减)
- 记录操作日志(把 OLD/NEW 写入审计表)
- 实现级联逻辑(如删除用户时清空其评论)
- 自动生成计算字段或默认值(如创建时间、更新时间戳)
简单示例说明
比如在 orders 表插入新订单后,自动减少 product 表对应商品的库存:
CREATE TRIGGER update_stock_after_order
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
UPDATE product SET num = num – NEW.quantity WHERE pid = NEW.pid;
END;
这里 NEW.quantity 和 NEW.pid 就是刚插入那行订单里的字段值,MySQL 自动提供,无需额外查询。