首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 設定欄位預設為當前時間:DATETIME vs TIMESTAMP 與 Trigger 方案

     編輯:MySQL 資料庫相關知識

核心限制

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_TIMESTAMP5.6.5+是否推薦新專案使用
DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP5.6.5+是是推薦新專案使用
Trigger (BEFORE INSERT)所有版本是可自訂舊版本唯一通用方案

TIMESTAMP 自動更新規則細節

  • 表中第一個 TIMESTAMP 欄位才具備自動屬性。
  • 明確指定值(含 NULL)時不觸發自動更新。
  • UPDATE t SET ts = ts WHERE ... 不會刷新(值未變)。
  • 其他 TIMESTAMP 欄位需手動 SET ts = NOW() 或 SET ts = NULL 觸發。

Trigger 通用方案(兼容所有版本)

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 ;

最佳實踐建議

  1. MySQL 5.6.5+:直接用 DATETIME DEFAULT CURRENT_TIMESTAMP(建立時間)或 DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(更新時間),語意清晰、無時區陷阱。
  2. 舊版本:建立時間用 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,更新時間用 Trigger。
  3. 避免在同一表建立多個自動更新的 TIMESTAMP,易混淆。
  4. 應用層明確傳值時,資料庫不會覆蓋,保留應用層控制權。

時區注意

  • TIMESTAMP 存儲為 UTC,讀取時轉換為會話時區。
  • DATETIME 存儲字面值,不做時區轉換。
  • 跨時區應用建議統一用 DATETIME + 應用層處理時區,或資料庫層統一 UTC。

依版本選擇正確方案,即可優雅實現「建立時間不可變、更新時間自動刷新」的通用需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved