承接上文理論分析,本文通過 8 個可直接運行的構建-驗證案例,直觀展示 TIMESTAMP 隱式屬性生效過程、SHOW CREATE TABLE 反饋、唯一索引衝突觸發、雙列約束報錯邊界,作為上文的「實驗報告」配套參考。
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,第二列默認零值
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;
INSERT INTO dj2 VALUES (1,NULL,NULL), (2,NULL,NULL);
SELECT * FROM dj2;
-- b、c 均為插入時刻
CREATE UNIQUE INDEX dj2_idx_u1 ON dj2(b);
UPDATE dj2 SET a=9;
SELECT * FROM dj2;
-- 成功!b 不再自動更新,無 Duplicate Entry
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
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): 同上
CREATE TABLE dj5 (
a CHAR(1),
b TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
c TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- ERROR 1293 (HY000): 同上
| 表名 | b 列定義 | c 列定義 | 結果 | 原因 |
|---|---|---|---|---|
| dj1 | 無顯式 (隱式 ON UPDATE) | 無顯式 (隱式零值) | ✅ 成功 | 僅第一列隱式獲得 ON UPDATE |
| dj2 | DEFAULT CURRENT_TIMESTAMP | DEFAULT '0' | ✅ 成功 | 顯式關閉 b 的 ON UPDATE |
| dj3 | DEFAULT CURRENT_TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE | ❌ 1293 | 兩列都出現 CURRENT_TIMESTAMP |
| dj4 | DEFAULT CURRENT_TIMESTAMP | DEFAULT '0' ON UPDATE | ❌ 1293 | c 列 ON UPDATE 視同使用 CURRENT_TIMESTAMP |
| dj5 | DEFAULT CURRENT_TIMESTAMP ON UPDATE | DEFAULT CURRENT_TIMESTAMP | ❌ 1293 | 兩列都出現 CURRENT_TIMESTAMP |
DEFAULT 與 ON UPDATECURRENT_TIMESTAMP 關鍵字(無論在 DEFAULT 還是 ON UPDATE 中)DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP 同樣觸發 1293created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP