SQL执行没有报错,updated_at却和之前一样。MySQL的自动更新时间看的是其他列的值有没有实际变化,先把这一条与应用生成的SQL对照起来。

先查列定义
执行SHOW CREATE TABLE orders;查看实际定义。DEFAULT CURRENT_TIMESTAMP管插入时未提供值的情形;ON UPDATE CURRENT_TIMESTAMP才负责自动更新。默认值本身不会让列跟着每次修改刷新。本例以MySQL 8.4手册为准,旧表要以真实定义为准。
区分没有匹配、同值更新与真实变更
用主键检查行是否存在、字段原值是什么,再对照应用发送的SQL。若其它列都被设回原值,自动更新时间保持不变。应用明确设置updated_at = updated_at也会抑制自动更新。不要单凭驱动返回的影响行数判断。客户端设置会影响它报告匹配行还是实际变更行。
分清业务修改时间和触碰时间
若需求是每次业务触碰都刷新,应由应用明确设置updated_at = CURRENT_TIMESTAMP,不要把自动行为当成审计日志。同一秒内的多次变化可能显示相同值;需要小数秒时评估DATETIME(6)和一致的CURRENT_TIMESTAMP(6)精度。时间戳不宜代替严格递增版本号。
核对触发器和应用写入
可用SHOW TRIGGERS;检查应用库中的触发器,并查看ORM生成的SQL。触发器和显式赋值都可能改变结果;不要根据列名猜测是谁维护它。
用三种写入对照验收
在萤光云或LightNode的隔离数据库用测试行验证:只更新成原值、修改其他字段、显式刷新时间。分别读取字段与updated_at,确保操作跨过列的显示精度。上线标准是字段的实际行为与业务语义一致,而非单次SQL成功。
FAQ
ON UPDATE能用于DATETIME吗? MySQL 8.4支持。
相同值会更新时间吗? 自动更新不会,显式赋值另算。
时间相同一定没更新吗? 不一定,先查精度。
可以用更新时间做并发版本吗? 需要严格区分写入时优先用专用版本列。
应先改表结构吗? 先核对真实列定义和业务写法。
温馨提示
在生产环境修改列定义前评估锁、复制延迟和旧应用兼容性。不要为了刷新时间而批量改写业务列。


