Mysql CURRENT_TIMESTAMP
在 MySQL 中,CURRENT_TIMESTAMP 是一个用于获取或设置当前日期和时间的函数/关键字,广泛应用于时间戳字段的默认值或自动更新场景。
核心功能
- DEFAULT CURRENT_TIMESTAMP:插入新行时自动设置当前时间(若未显式指定值)
- ON UPDATE CURRENT_TIMESTAMP:更新行时自动刷新为当前时间(需其他列值变化触发)
获取当前时间
CURRENT_TIMESTAMP 等价于 NOW(),返回当前日期和时间(格式为 YYYY-MM-DD HH:MM:SS)
自动更新
配合 ON UPDATE CURRENT_TIMESTAMP,可在记录更新时自动将字段值设为当前时间
CREATE TABLE t ( created_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6), updated_at DATETIME(6) ON UPDATE CURRENT_TIMESTAMP(6) ); SELECT CURRENT_TIMESTAMP(3); -- 精确到毫秒,如:2024-01-01 12:00:00.123
与 NOW()、SYSDATE() 的区别
- CURRENT_TIMESTAMP / NOW() 返回语句开始执行时的时间,同一事务内多次调用结果相同
- SYSDATE() 返回函数实际执行时的时间,同一语句中多次调用可能不同
代码如下:
-- NOW() 和 CURRENT_TIMESTAMP 在同一事务内一致 START TRANSACTION; SELECT NOW(); -- 2024-01-01 10:00:00 DO SLEEP(2); SELECT NOW(); -- 仍是 2024-01-01 10:00:00(不变) COMMIT; -- SYSDATE() 实时变化 SELECT SYSDATE(); -- 10:00:00 DO SLEEP(2); SELECT SYSDATE(); -- 10:00:02(变了)
时区影响
如果服务器时区与应用时区不一致,TIMESTAMP 列的值会出现偏差,推荐明确设置 time_zone。
-- 查看当前时区设置 SHOW VARIABLES LIKE 'time_zone'; -- TIMESTAMP 类型:存储UTC,读取时转换为会话时区(受时区影响) -- DATETIME 类型:存储字面值,不做时区转换(不受时区影响) -- 设置会话时区 SET time_zone = '+08:00'; SELECT CURRENT_TIMESTAMP; -- 显示东八区时间
TIMESTAMP 类型的范围限制
- TIMESTAMP:范围是 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC(2038年问题)
- DATETIME:范围是 1000-01-01 ~ 9999-12-31,无2038问题
推荐:新项目使用 DATETIME + DEFAULT CURRENT_TIMESTAMP,避免2038年问题。
NULL 值处理行为
TIMESTAMP 在 strict mode 关闭时,NOT NULL 列插入 NULL 会自动填充当前时间(旧版行为),MySQL 5.7+ strict mode 默认开启,此行为已改变。
-- 明确允许 NULL 的写法 CREATE TABLE t ( created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
DEFAULT CURRENT_TIMESTAMP 与 DEFAULT NULL 的选择建议
- 必须记录创建时间 NOT NULL DEFAULT CURRENT_TIMESTAMP
- 允许"未知时间" NULL DEFAULT NULL
- 需要区分"未操作"和"已操作" NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
典型应用场景
1. 创建时间字段(仅插入时设置)
CREATE TABLE example ( id INT AUTO_INCREMENT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
2. 更新时间字段(插入和更新均自动设置)
CREATE TABLE example ( id INT AUTO_INCREMENT PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
这两个操作是mysql数据库本身在维护,所以可以根据这个特性来生成【创建时间】和【更新时间】两个字段,且不需要代码来维护。
3. 查询当前时间
SELECT CURRENT_TIMESTAMP, NOW();

浙公网安备 33010602011771号