四種定義模式對比
| 定義語法 | INSERT 時 | UPDATE 時 | 適用場景 |
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 當前時間 | 自動刷新為當前時間 | 修改時間戳 |
TIMESTAMP DEFAULT CURRENT_TIMESTAMP | 當前時間 | 不變 | 創建時間戳 |
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 0000-00-00 00:00:00 | 自動刷新 | 極少用 |
TIMESTAMP DEFAULT '2000-01-01 00:00:00' | 固定默認值 | 不變(除非顯式 UPDATE) | 業務默認值 |
關鍵規則
- **一張表只能有一個列使用 `DEFAULT CURRENT_TIMESTAMP`** 作為隱式默認值(MySQL 5.6.5+ 放寬,但建議遵守)。
- 若需「創建時間」+「修改時間」,創建時間用
DATETIME DEFAULT CURRENT_TIMESTAMP(5.6.5+ 支援),修改時間用 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
- 未顯式指定
DEFAULT 或 ON UPDATE 時,等同於 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
TIMESTAMP 範圍 1970-2038,跨世紀業務請用 DATETIME。
實戰建表範例
CREATE TABLE t_log (
id INT AUTO_INCREMENT PRIMARY KEY,
content VARCHAR(255),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 創建時間,不變
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 修改時間,自動刷新
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
驗證行為
INSERT INTO t_log (content) VALUES ('first');
-- created_at=2024-01-01 10:00:00, updated_at=2024-01-01 10:00:00
UPDATE t_log SET content='second' WHERE id=1;
-- created_at 不變, updated_at=2024-01-01 10:05:00