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

MySQL 欄位預設值設為當前時間:TIMESTAMP 自動更新機制完整解析

     編輯:MySQL 資料庫相關知識

核心結論

MySQL 不支援 DEFAULT NOW() 或 DEFAULT CURRENT_TIMESTAMP(5.6.5 前)。解決方案:使用 TIMESTAMP 型別,利用其內建自動初始化與更新特性。

TIMESTAMP 型別完整規則

顯示格式與長度

定義顯示格式儲存精度
TIMESTAMP(14)YYYYMMDDHHMMSS統一 14 位元完整精度
TIMESTAMP(12)YYMMDDHHMMSS
TIMESTAMP(10)YYMMDDHHMM
TIMESTAMP(8)YYYYMMDD
TIMESTAMP(6)YYMMDD
TIMESTAMP(4)YYMM
TIMESTAMP(2)YY

關鍵:無論顯示長度,內部皆儲存完整秒級時間(1970-01-01 ~ 2038-01-19)。

長度規則

  • 0 或 >14 → 強制 14
  • 奇數長度 → 強制下一個偶數(1→2, 5→6)

自動初始化/更新規則(核心)

表中第一個 TIMESTAMP 欄位擁有自動特性:

  1. INSERT 時:未顯式給值 → 設為當前時間。
  2. UPDATE 時:未顯式給值且其他欄位實際改變 → 更新為當前時間。
  3. 顯式設 NULL:觸發自動更新(等同 NOW())。
  4. 第二個及以後 TIMESTAMP:無自動特性,需顯式給值或設 DEFAULT CURRENT_TIMESTAMP(5.6.5+)。

實戰演示

CREATE TABLE t (
    id INT PRIMARY KEY AUTO_INCREMENT,
    ts1 TIMESTAMP(14),      -- 第 1 個:自動初始化+更新
    ts2 TIMESTAMP(14),      -- 第 2 個:無自動特性
    ts3 TIMESTAMP(14) DEFAULT CURRENT_TIMESTAMP  -- 5.6.5+ 可指定預設
);

INSERT INTO t (ts1, ts2, ts3) VALUES (NULL, NULL, NULL);
-- ts1=now, ts2=now, ts3=now

INSERT INTO t () VALUES ();
-- ts1=now, ts2=0000..., ts3=now (5.6.5+)

UPDATE t SET id=2 WHERE id=1;
-- ts1 更新為 now(因 id 變化),ts2 不變,ts3 不變

UPDATE t SET ts1=ts1, ts3=NOW() WHERE id=2;
-- ts1 不變(顯式給相同值),ts3 更新為 now

格式化輸出

SELECT id,
    DATE_FORMAT(ts1, '%Y-%m-%d %H:%i:%s') AS ts1,
    DATE_FORMAT(ts2, '%Y-%m-%d %H:%i:%s') AS ts2
FROM t;

型別轉換陷阱

轉換方向結果
DATE → DATETIME/TIMESTAMP時間部份補 00:00:00
DATETIME/TIMESTAMP → DATE截斷時間部份
'1968-01-01' → TIMESTAMP非法,轉為 0(超出 1970-2038 範圍)
2 位數年份00-69→2000-2069, 70-99→1970-1999

最佳實踐建議

  • 建表時間欄位:created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP(5.6.5+),updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
  • 5.6.5 前版本:第一個 TIMESTAMP 做 updated_at,created_at 用 DATETIME + 應用層寫入。
  • 跨時區系統:儲存 UTC,應用層轉換;TIMESTAMP 內部轉 UTC 儲存,讀取轉回 Session 時區。
  • 2038 年問題:長期專案改用 DATETIME(範圍 1000-9999 年)+ 應用層維護。

善用 TIMESTAMP 自動特性,少寫代碼、少出錯、時間欄位永不為空。

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