datetime加on update current_timestamp报错因缺少default值;mysql 5.6.5+要求必须同时声明default current_timestamp(或确定默认值);已有字段需用change/modify重定义;生产推荐datetime而非timestamp。

DATETIME加ON UPDATE CURRENT_TIMESTAMP为什么报错?
最常遇到的是 ERROR 1067 (42000): Invalid default value for 'xxx'。MySQL 5.6.5+ 要求:只要用了 ON UPDATE CURRENT_TIMESTAMP,就必须同时声明 DEFAULT CURRENT_TIMESTAMP(或一个确定的常量默认值),缺一不可。
错误写法示例:
ALTER TABLE users ADD COLUMN updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP;
正确做法是补全默认值:
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP- 若允许 NULL:
updated_at DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP - 不能只写
NOT NULL ON UPDATE CURRENT_TIMESTAMP——没默认值,建表或修改会直接失败
给已有DATETIME字段添加自动更新要怎么改?
MySQL 不支持对已有列“追加”ON UPDATE 属性。必须用 CHANGE COLUMN 或 MODIFY COLUMN 重定义整个字段定义。
假设原字段是:
updated_at DATETIME
想启用自动更新,执行:
ALTER TABLE users CHANGE COLUMN updated_at updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
注意点:
- 如果原字段是
NOT NULL且无默认值,新语句里必须带上NOT NULL,否则会因隐式 NULL 冲突失败 - MySQL 版本必须 ≥ 5.6.5;5.5 及更早不支持 DATETIME 的
ON UPDATE - 执行后历史数据不变,只影响后续 INSERT/UPDATE 行为
DATETIME vs TIMESTAMP:选哪个更稳妥?
生产环境优先用 DATETIME,除非你明确需要时区转换。
TIMESTAMP 看似省事(不用写 DEFAULT 也能自动生效),但有硬伤:
- 值范围窄(1970–2038),超出变
0000-00-00 00:00:00 - 存储为 UTC、读取转本地时区,跨服务部署易出时间错乱
- MySQL 5.6.5 前,一个表最多只能有一个
TIMESTAMP字段带CURRENT_TIMESTAMP行为(即使你写了两个,第二个也会被忽略)
DATETIME 没有时区干扰,范围大(1000–9999),行为完全可控——只要你显式写出 DEFAULT 和 ON UPDATE。
UPDATE时自动更新没触发?检查这三点
自动更新只在满足全部条件时才发生:
- UPDATE 语句中该字段未被显式赋值(哪怕写
updated_at = NOW()或updated_at = updated_at,都会跳过自动逻辑) - 字段定义完整包含
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP - 不是通过
INSERT ... ON DUPLICATE KEY UPDATE触发的——这种语法下ON UPDATE仍会生效,但容易和业务预期冲突(比如误把插入当成更新)
最容易被忽略的是第一点:开发中常习惯在 ORM 或 SQL 里顺手带上时间字段,结果反而关掉了自动更新。真要用自动逻辑,就得确保 UPDATE 语句里彻底不提它。











