核心行為差異
| 定義語法 | 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' | 固定值 | 不變 | 靜態預設 |
實測驗證 (建表與操作)
-- 情況 1:建立+更新皆自動
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 = NOW()
UPDATE t1 SET p_c = 2 WHERE p_c = 1; -- p_time 更新為 NOW()
-- 情況 2:僅建立自動 (建立時間)
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 = NOW()
UPDATE t2 SET p_c = 2 WHERE p_c = 1; -- p_time 保持不變
-- 情況 3:單表多 TIMESTAMP 欄位 (僅一個可用 CURRENT_TIMESTAMP)
CREATE TABLE t3 (
p_c INT NOT NULL,
p_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
p_time2 TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB;
完整規則總結 (官方文檔)
- 同時有
DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP:預設現在、更新自動刷新
- 兩者皆無:等同於 (1)
- 僅
DEFAULT CURRENT_TIMESTAMP:預設現在、不自動更新
- 僅
ON UPDATE CURRENT_TIMESTAMP:預設 0、更新自動刷新
- 有常數
DEFAULT:預設常數、不自動初始化;若加 ON UPDATE 則更新自動刷新
最佳實踐建議
- 建立時間:使用
DATETIME + DEFAULT CURRENT_TIMESTAMP (5.6.5+) 或應用層寫入 NOW()
- 更新時間:使用
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- 避免單表多個
DEFAULT CURRENT_TIMESTAMP 欄位衝突
- 5.6+ 支援
DATETIME 同樣的自動初始化/更新語法,推薦統一用 DATETIME 避免 2038 年問題