MySQL触发器中通过NEW和OLD获取字段值INSERT只有NEWDELETE只有OLDUPDATE两者都有NEW在BEFORE中可修改OLD始终只读注意大小写、反引号包裹特殊列名及跨库操作限制。触发器里怎么拿到修改前后的字段值MySQL 触发器中用 NEW 和 OLD 代表当前操作涉及的行数据不是变量不能声明或赋值是只读上下文对象。INSERT 触发器只有 NEWDELETE 只有 OLDUPDATE 两者都有。直接用 NEW.column_name 或 OLD.column_name 访问字段注意大小写敏感和表定义一致。如果列名含空格或关键字必须用反引号包裹NEW.order statusNEW 在 BEFORE INSERT 中可被修改用于默认值、清洗AFTER 中只读OLD 在任何时机都不可写尝试赋值会报错ERROR 1362 (HY000): Updating of OLD row is not allowed in trigger对未在 SET 子句中出现的字段NEW.column 在 UPDATE 中仍为原值不是 NULLBEFORE UPDATE 触发器中改 NEW 字段没生效常见现象写了 SET NEW.updated_at NOW(); 却发现时间没更新——大概率是触发器定义在了 AFTER 而非 BEFORE。AFTER 触发器里改 NEW 完全无效语句已执行完毕只有 BEFORE 阶段才能干预即将插入/更新的数据。检查触发器定义SHOW CREATE TRIGGER trigger_name; 看开头是 BEFORE 还是 AFTER若想自动填充时间戳必须用 BEFORE并确保目标字段允许 NULL 或无默认值否则可能冲突对主键或唯一键字段BEFORE UPDATE 中修改 NEW 可能引发重复键错误需提前校验触发器里用 OLD 记日志但 DELETE 时发现字段全是 NULL不是 OLD 失效而是你查的字段在原表里定义为 TEXT 或 BLOB 类型且触发器里用了函数如 CONCAT(OLD.content, deleted) —— MySQL 在某些版本尤其是 5.7对大字段在触发器上下文中的处理不一致可能返回 NULL。 橙篇 百度文库发布的一款综合性AI创作工具