mysql中设置字段默认值为当前时间戳的两种方式是:timestamp字段可直接用default current_timestamp和on update current_timestamp;datetime字段从5.6.5起支持default current_timestamp,但不支持on update current_timestamp,需用触发器实现自动更新。

MySQL中设置字段默认值为当前时间戳的两种方式
MySQL 5.6.5+ 支持 TIMESTAMP 和 DATETIME 字段使用 CURRENT_TIMESTAMP 作为默认值,但行为差异很大。直接写 DEFAULT CURRENT_TIMESTAMP 在 TIMESTAMP 上生效,在 DATETIME 上会报错(除非开启 explicit_defaults_for_timestamp=OFF,但不推荐)。
-
TIMESTAMP字段天然支持DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP -
DATETIME从 MySQL 5.6.5 起也支持,但必须显式声明,且不能同时用两个自动更新子句 - 不要用字符串
'CURRENT_TIMESTAMP'—— 这会被当作文本字面量存入,不是函数调用
建表时正确声明 CURRENT_TIMESTAMP 默认值
建表语句里,TIMESTAMP 字段最简写法是:
CREATE TABLE logs ( id INT PRIMARY KEY AUTO_INCREMENT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
如果还希望更新时自动刷新,加 ON UPDATE CURRENT_TIMESTAMP:
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
注意:一张表里最多只能有一个 TIMESTAMP 字段带 ON UPDATE CURRENT_TIMESTAMP(MySQL 5.6),5.7+ 放宽限制,但 DATETIME 仍不支持自动 ON UPDATE 除非用触发器。
ALTER TABLE 添加默认时间戳字段的常见错误
执行 ALTER TABLE t ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 时容易出错:
- 如果表已有
TIMESTAMP字段且没指定默认值,MySQL 可能自动把它变成NOT NULL DEFAULT '0000-00-00 00:00:00',导致后续添加新字段失败 - 显式指定
NULL或NOT NULL更安全:updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP - 对已存在数据的表,新增字段若设
NOT NULL但没给默认值,会报错;此时必须先给默认值或允许NULL
DATETIME 类型用 CURRENT_TIMESTAMP 的兼容性要点
DATETIME 支持默认值为 CURRENT_TIMESTAMP,但仅限 MySQL 5.6.5+,且有硬性限制:
- 不能和
ON UPDATE CURRENT_TIMESTAMP同时用于同一个DATETIME字段(会报错Invalid default value for 'xxx') - 想实现“创建时赋值、更新时也更新”,只能用触发器,或改用
TIMESTAMP -
DATETIME默认不带时区,TIMESTAMP存储为 UTC、读取时转为会话时区——这点在跨时区部署时特别容易被忽略
字段类型选型不是只看“能不能用”,而是看“要不要时区转换”“要不要自动更新”“要不要兼容老版本”。哪怕只是记录创建时间,TIMESTAMP DEFAULT CURRENT_TIMESTAMP 仍是目前最省心、最不易出错的选择。











