首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL TIMESTAMP 默認值應用實戰:8 個遞進案例驗證隱式規則與約束邊界

     編輯:MySQL 綜合教學

前言

承接上文理論分析,本文通過 8 個可直接運行的構建-驗證案例,直觀展示 TIMESTAMP 隱式屬性生效過程、SHOW CREATE TABLE 反饋、唯一索引衝突觸發、雙列約束報錯邊界,作為上文的「實驗報告」配套參考。

案例 1:查看 dj1 隱式定義

SHOW CREATE TABLE dj1\G
-- 輸出確認:
-- b: timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-- c: timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
-- 結論:第一列自動獲得 ON UPDATE,第二列默認零值

案例 2:建表 dj2,b 僅 DEFAULT CURRENT_TIMESTAMP

CREATE TABLE dj2 (
    a CHAR(1),
    b TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    c TIMESTAMP DEFAULT '0000-00-00 00:00:00',
    UNIQUE KEY dj2_idx_u1 (b)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

案例 3:插入測試數據

INSERT INTO dj2 VALUES (1,NULL,NULL), (2,NULL,NULL);
SELECT * FROM dj2;
-- b、c 均為插入時刻

案例 4:創建唯一索引並更新驗證

CREATE UNIQUE INDEX dj2_idx_u1 ON dj2(b);
UPDATE dj2 SET a=9;
SELECT * FROM dj2;
-- 成功!b 不再自動更新,無 Duplicate Entry

案例 5:嘗試 dj3,兩列都帶 CURRENT_TIMESTAMP → 1293

CREATE TABLE dj3 (
    a CHAR(1),
    b TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    c TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- ERROR 1293 (HY000): only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

案例 6:嘗試 dj4,c 列零值帶 ON UPDATE → 1293

CREATE TABLE dj4 (
    a CHAR(1),
    b TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    c TIMESTAMP DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP
);
-- ERROR 1293 (HY000): 同上

案例 7:嘗試 dj5,b 帶 ON UPDATE,c 帶 DEFAULT → 1293

CREATE TABLE dj5 (
    a CHAR(1),
    b TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    c TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- ERROR 1293 (HY000): 同上

案例 8:總結邊界條件

表名b 列定義c 列定義結果原因
dj1無顯式 (隱式 ON UPDATE)無顯式 (隱式零值)✅ 成功僅第一列隱式獲得 ON UPDATE
dj2DEFAULT CURRENT_TIMESTAMPDEFAULT '0'✅ 成功顯式關閉 b 的 ON UPDATE
dj3DEFAULT CURRENT_TIMESTAMPDEFAULT CURRENT_TIMESTAMP ON UPDATE❌ 1293兩列都出現 CURRENT_TIMESTAMP
dj4DEFAULT CURRENT_TIMESTAMPDEFAULT '0' ON UPDATE❌ 1293c 列 ON UPDATE 視同使用 CURRENT_TIMESTAMP
dj5DEFAULT CURRENT_TIMESTAMP ON UPDATEDEFAULT CURRENT_TIMESTAMP❌ 1293兩列都出現 CURRENT_TIMESTAMP

核心結論速記

  1. 顯式 > 隱式:永遠顯式寫出 DEFAULT 與 ON UPDATE
  2. 唯一性:全表僅允許一個 TIMESTAMP 列出現 CURRENT_TIMESTAMP 關鍵字(無論在 DEFAULT 還是 ON UPDATE 中)
  3. 零值陷阱:DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP 同樣觸發 1293
  4. 位置無關:哪一列寫了 CURRENT_TIMESTAMP 都算,不限於第一列
  5. 實戰模板:
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved