建表時同時需要 創建時間(默認 CURRENT_TIMESTAMP) 與 更新時間(ON UPDATE CURRENT_TIMESTAMP),MySQL 5.5/5.6 版本有嚴格限制,5.7+ 已放開。本文詳細說明版本差異與遷移方案。
CREATE TABLE RS_SIGNUPUSER ( ID VARCHAR(36) PRIMARY KEY, CREATETIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '註冊時間', UPDATETIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間' );
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
5.5/5.6:Timestamp Initialization
One TIMESTAMP column in a table can have the current timestamp as the default value for initializing the column, as the auto-update value, or both. It is not possible to have the current timestamp be the default value for one column and the auto-update value for another column.
5.7+:已移除該限制,支援多欄位獨立使用 DEFAULT/ON UPDATE。
原生支援,無需代碼變更,同時獲得性能、優化器、JSON、GIS 等新特性。
CREATE TABLE RS_SIGNUPUSER ( ID VARCHAR(36) PRIMARY KEY, CREATETIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UPDATETIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ); DELIMITER // CREATE TRIGGER trg_update_time BEFORE UPDATE ON RS_SIGNUPUSER FOR EACH ROW BEGIN SET NEW.UPDATETIME = CURRENT_TIMESTAMP; END// DELIMITER ;
@CreationTimestamp/@UpdateTimestamp 自動填充。CREATE TABLE t ( created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
MySQL 8.0.13 起 DATETIME 也支援 DEFAULT CURRENT_TIMESTAMP 與 ON UPDATE,且無 5.6 版本的單欄限制。
system_time_zone、time_zone 一致,避免時間偏移。TIMESTAMP 存儲業務時間:2038 年溢出、時區轉換陷阱、隱式轉換導致索引失效。