MySQL 5.6.5 之前:DATETIME 型別不支援 DEFAULT NOW() 或 DEFAULT CURRENT_TIMESTAMP,會報錯。
MySQL 5.6.5+:DATETIME、TIMESTAMP 均支援 DEFAULT CURRENT_TIMESTAMP 及 ON UPDATE CURRENT_TIMESTAMP。
| 方案 | 適用版本 | 建立時自動填入 | 更新時自動刷新 | 備註 |
|---|---|---|---|---|
| TIMESTAMP DEFAULT CURRENT_TIMESTAMP | 所有版本 | 是 | 否 | 僅第一個 TIMESTAMP 欄位自動更新 |
| TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 所有版本 | 是 | 是 | 第一個 TIMESTAMP 欄位 |
| DATETIME DEFAULT CURRENT_TIMESTAMP | 5.6.5+ | 是 | 否 | 推薦新專案使用 |
| DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 5.6.5+ | 是 | 是 | 推薦新專案使用 |
| Trigger (BEFORE INSERT) | 所有版本 | 是 | 可自訂 | 舊版本唯一通用方案 |
NULL)時不觸發自動更新。UPDATE t SET ts = ts WHERE ... 不會刷新(值未變)。SET ts = NOW() 或 SET ts = NULL 觸發。CREATE TABLE test_time (
id INT(11),
create_time DATETIME
);
DELIMITER |
CREATE TRIGGER default_datetime
BEFORE INSERT ON test_time
FOR EACH ROW
BEGIN
IF NEW.create_time IS NULL THEN
SET NEW.create_time = NOW();
END IF;
END|
DELIMITER ;
DATETIME DEFAULT CURRENT_TIMESTAMP(建立時間)或 DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(更新時間),語意清晰、無時區陷阱。TIMESTAMP DEFAULT CURRENT_TIMESTAMP,更新時間用 Trigger。TIMESTAMP 存儲為 UTC,讀取時轉換為會話時區。DATETIME 存儲字面值,不做時區轉換。DATETIME + 應用層處理時區,或資料庫層統一 UTC。依版本選擇正確方案,即可優雅實現「建立時間不可變、更新時間自動刷新」的通用需求。