如何设置MySQL触发器在字段变更时自动更新时间戳?
- 内容介绍
- 文章标签
- 相关推荐
本文共计926个文字,预计阅读时间需要4分钟。
MySQL 5.6.5原生支持ON UPDATE CURRENT_TIMESTAMP,它比触发器更轻量、更稳定、更少出错。对于大量更新时间自动更新时间的需求,直接依靠字段定义即可搞定,基本不需要触发器。
常见错误是:看到“自动更新”就条件反射写 BEFORE UPDATE 触发器,结果引入额外执行路径、时区不一致、字段冲突等问题。比如:
-
ERROR 1364 (HY000): Field 'updated_at' doesn't have a default value:字段NOT NULL但没设DEFAULT,INSERT 就失败,触发器压根没机会运行 - 执行
UPDATE t SET name = name(值未实际变化),MySQL 会跳过整行更新,BEFORE UPDATE触发器也不会触发 - 混用
NOW()和CURRENT_TIMESTAMP,在复制或严格模式下行为可能不一致
真要写 BEFORE UPDATE 触发器时,必须注意这三点
只有当满足全部以下条件才考虑触发器:MySQL 版本 INT/BIGINT 存 Unix 时间戳;或需要复杂判断逻辑(例如“仅当 status 字段从 'pending' 变为 'done' 才更新时间”)。
本文共计926个文字,预计阅读时间需要4分钟。
MySQL 5.6.5原生支持ON UPDATE CURRENT_TIMESTAMP,它比触发器更轻量、更稳定、更少出错。对于大量更新时间自动更新时间的需求,直接依靠字段定义即可搞定,基本不需要触发器。
常见错误是:看到“自动更新”就条件反射写 BEFORE UPDATE 触发器,结果引入额外执行路径、时区不一致、字段冲突等问题。比如:
-
ERROR 1364 (HY000): Field 'updated_at' doesn't have a default value:字段NOT NULL但没设DEFAULT,INSERT 就失败,触发器压根没机会运行 - 执行
UPDATE t SET name = name(值未实际变化),MySQL 会跳过整行更新,BEFORE UPDATE触发器也不会触发 - 混用
NOW()和CURRENT_TIMESTAMP,在复制或严格模式下行为可能不一致
真要写 BEFORE UPDATE 触发器时,必须注意这三点
只有当满足全部以下条件才考虑触发器:MySQL 版本 INT/BIGINT 存 Unix 时间戳;或需要复杂判断逻辑(例如“仅当 status 字段从 'pending' 变为 'done' 才更新时间”)。

