TIMESTAMP 默認行為:INSERT 和 UPDATE 都會自動刷新為當前時間。 若需記錄「創建時間」,請使用 DATETIME + NOW() 或顯式指定 DEFAULT CURRENT_TIMESTAMP 且不帶 ON UPDATE。
| 定義語法 | INSERT 行為 | UPDATE 行為 | 適用場景 |
|---|---|---|---|
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 當前時間 | 自動刷新 | 最後修改時間 |
TIMESTAMP DEFAULT CURRENT_TIMESTAMP | 當前時間 | **不變** | 創建時間(推薦) |
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 0000-00-00 00:00:00 | 自動刷新 | 極少用 |
TIMESTAMP DEFAULT '2000-01-01' | 固定默認值 | 不變 | 業務默認值 |
-- 表 t1:雙向自動更新
CREATE TABLE t1 (
p_c INT NOT NULL,
p_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;
INSERT INTO t1(p_c) VALUES (1); -- p_time = 當前時間
UPDATE t1 SET p_c = 2 WHERE p_c = 1; -- p_time 刷新為最新時間
-- 表 t2:僅 INSERT 自動賦值
CREATE TABLE t2 (
p_c INT NOT NULL,
p_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
INSERT INTO t2(p_c) VALUES (1); -- p_time = 當前時間
UPDATE t2 SET p_c = 2 WHERE p_c = 1; -- p_time **保持不變**
-- 錯誤:兩個列都有 DEFAULT CURRENT_TIMESTAMP
CREATE TABLE t3 (
t1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
t2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- ERROR 1293
);
-- 正確:第二列顯式指定默認值為零或常量
CREATE TABLE t3 (
t1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
t2 TIMESTAMP DEFAULT '0000-00-00 00:00:00'
);
CREATE TABLE t4 (
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
**推薦做法**:5.6.5+ 直接用 DATETIME 記錄創建/更新時間,語義清晰、無時區轉換、範圍更大(1000-9999 年)。
TIMESTAMP 存儲為 UTC,讀取時按會話時區轉換DATETIME 存儲原始值,不做時區轉換DATETIME 或統一應用層時區created_at DATETIME DEFAULT CURRENT_TIMESTAMP(5.6.5+)或 TIMESTAMP DEFAULT CURRENT_TIMESTAMP(舊版)updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(5.6.5+)或 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPNOW() 覆蓋默認行為時,確保時區一致