mysql建表时可为timestamp或datetime字段设current_timestamp默认值:timestamp直接支持default和on update;datetime自5.6.5起支持default,显式声明才支持on update;insert未指定该字段才触发默认值;仅current_timestamp可用于默认值,now()和sysdate()不适用。

CREATE TABLE 时直接定义 CURRENT_TIMESTAMP 默认值
MySQL 支持在建表时为 DATETIME 或 TIMESTAMP 类型字段指定 CURRENT_TIMESTAMP 作为默认值,但必须注意类型限制和语法细节:
-
TIMESTAMP字段可以直接用DEFAULT CURRENT_TIMESTAMP,且支持自动更新(ON UPDATE CURRENT_TIMESTAMP) -
DATETIME从 MySQL 5.6.5+ 开始才支持DEFAULT CURRENT_TIMESTAMP,但不支持ON UPDATE CURRENT_TIMESTAMP(除非显式声明为DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,该语法在 5.6.5+ 也有效) - 一个表中最多只能有一个
TIMESTAMP字段能同时使用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP(MySQL 5.6.5–5.7.22),8.0+ 已解除此限制
示例:
CREATE TABLE logs ( id INT PRIMARY KEY AUTO_INCREMENT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
ALTER TABLE 添加带 CURRENT_TIMESTAMP 默认值的字段
对已有表添加时间戳字段并设默认值,需明确指定类型和约束,否则容易报错:
- 不能对已存在的
NOT NULL字段直接加DEFAULT CURRENT_TIMESTAMP,除非提供DEFAULT值或允许NULL - 若字段类型是
DATETIME,MySQL 5.6.5 以下版本会报错:Invalid default value for 'xxx' - 推荐写法:先添加字段,再用
ALTER TABLE ... MODIFY COLUMN或CHANGE COLUMN补充默认值(避免隐式转换问题)
安全做法:
ALTER TABLE users ADD COLUMN created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP; -- 或非空且带默认: ALTER TABLE users ADD COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
INSERT 时不显式赋值才能触发默认时间戳
默认值只在 INSERT 语句中**未指定该字段**时生效;一旦字段出现在列名列表里(哪怕值为 NULL 或空字符串),MySQL 就不会自动填充 CURRENT_TIMESTAMP:
- ✅ 正确(触发默认):
INSERT INTO logs (id) VALUES (1); - ❌ 不触发(显式传 NULL):
INSERT INTO logs (id, created_at) VALUES (1, NULL);→created_at变成NULL(如果字段允许 NULL)或报错(如果NOT NULL且无默认) - ⚠️ 注意:如果字段定义为
NOT NULL且没给值,又没设默认值,会直接报错Field 'xxx' doesn't have a default value
区分 CURRENT_TIMESTAMP 和 NOW()、SYSDATE()
三者都返回当前时间,但在默认值上下文中行为不同:
-
CURRENT_TIMESTAMP是标准 SQL 兼容的关键词,在默认值和自动更新中被 MySQL 特殊识别,推荐优先使用 -
NOW()在某些旧版本中可作为CURRENT_TIMESTAMP的同义词,但不是所有场景都等价(例如复制环境下可能有差异) -
SYSDATE()返回函数执行时刻的时间(可能和语句开始时间不同),**不能用于列默认值**,MySQL 会报错:Invalid default value for 'xxx'
所以定义默认值时,只用 CURRENT_TIMESTAMP,别混用 NOW() 或 SYSDATE()。
实际部署时最容易忽略的是字段类型与 MySQL 版本的匹配,以及 INSERT 时是否意外显式传了 NULL —— 这两点一错,默认时间戳就失效了。











