贝利信息

mysql触发器before和after有什么区别_mysql执行顺序说明

日期:2026-01-20 00:00 / 作者:P粉602998670
BEFORE触发器可修改NEW行并中止操作,AFTER触发器只读且无法阻止主DML;前者用于默认值、校验等前置控制,后者适用于日志、统计等后置动作。

BEFORE 触发器能改数据,AFTER 不能

这是最核心的区别:在 BEFORE INSERTBEFORE UPDATE 中,你可以安全地修改 NEW 行的字段值,这些修改会真正写入表;而 AFTER 触发器里,NEW 是只读的——你试图赋值会报错:ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger

执行顺序决定能不能“拦住非法操作”

MySQL 的执行链条是严格线性的:BEFORE → 实际 DML → AFTER。这意味着:

什么时候必须用 BEFORE,什么时候只能用 AFTER

选错时机不是语法错误,而是逻辑漏洞。关键看你要做什么:

DELIMITER $$
CREATE TRIGGER order_before_check
  BEFORE INSERT ON orders
  FOR EACH ROW
BEGIN
  IF NEW.quantity > (SELECT stock FROM products WHERE id = NEW.product_id) THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insufficient stock';
  END IF;
END$$
DELIMITER ;

别忽略事务边界和性能影响

触发器天然运行在主 DML 所在事务中,这点极易被忽视:

真正难的从来不

是语法,而是想清楚:这一步动作,是该“卡在门口检查”,还是“等进门后再记一笔”。顺序错了,数据就不可信。