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

MySQL TIMESTAMP 欄位實現「預設當前時間」與自動更新完全指南

     編輯:MySQL 資料庫相關知識

核心限制

MySQL 不支援 `DEFAULT NOW()` 或 `DEFAULT CURRENT_TIMESTAMP` 於 DATETIME/DATE 欄位(5.6.5 前)。解決方案:使用 TIMESTAMP 或升級至 5.6.5+ 使用 DATETIME DEFAULT CURRENT_TIMESTAMP。

TIMESTAMP 完整特性表

關鍵:無論顯示長度,實際儲存皆為 14 位完整精度。`ALTER TABLE` 擴展顯示長度可「找回」隱藏的時分秒。

自動更新規則(僅第一個 TIMESTAMP 欄位)

  1. INSERT 未指定該欄位值
  2. LOAD DATA INFILE 未提供該欄位
  3. UPDATE 修改了其他欄位,且未顯式設定該 TIMESTAMP
  4. 顯式設定為 NULL 或 NOW()

多 TIMESTAMP 欄位控制

CREATE TABLE t (
    id INT PRIMARY KEY,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,      -- 建立時間(僅 INSERT)
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  -- 更新時間
);

MySQL 5.6.5+ 以上寫法標準化,舊版僅第一個 TIMESTAMP 擁有自動特性,第二個需觸發器或應用層維護。

格式化輸出

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

日期類型轉換陷阱

定義顯示格式儲存精度備註
TIMESTAMP(14)YYYYMMDDHHMMSS14 位完整格式
TIMESTAMP(8)YYYYMMDD14 位只顯示日期
TIMESTAMP(0)→ 強制 1414 位0/>14 皆為 14
奇數長度→ 下一偶數14 位1→2, 5→6

最佳實踐建議

  1. MySQL 5.6.5+:優先用 DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)(微秒精度、無 2038 年問題)
  2. 舊版:第一欄 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 當建立時間,更新時間用觸發器
  3. 應用層明確傳遞時間,避免依賴伺服器時區
  4. 時區統一用 UTC 儲存,顯示層轉換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
來源 → 目標結果
DATE → DATETIME/TIMESTAMP時間部份補 00:00:00
DATETIME/TIMESTAMP → DATE截斷時間部份
'1968-01-01' → TIMESTAMP非法 → 變 0 (1970 前)
2 位數年份00-69 → 2000-2069, 70-99 → 1970-1999