TIMESTAMP 具有「建立時默認當前時間、更新時自動刷新」的雙重特性,但多列時行為不同。本文梳理單列/雙列定義語句、三種屬性組合、explicit_defaults_for_timestamp 影響及最佳實踐。
CREATE TABLE t ( ctime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, utime TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB;
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。DEFAULT '0000-00-00 00:00:00'(零值),需手動加上 DEFAULT CURRENT_TIMESTAMP 或 ON UPDATE CURRENT_TIMESTAMP。| 定義 | INSERT 行為 | UPDATE 行為 |
|---|---|---|
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 當前時間 | 刷新當前時間 |
DEFAULT CURRENT_TIMESTAMP | 當前時間 | 不變 |
ON UPDATE CURRENT_TIMESTAMP | 零值 (0000-00-00) | 刷新當前時間 |
explicit_defaults_for_timestamp,啟用後**取消**第一個 TIMESTAMP 的隱含屬性,所有列行為一致,需顯式聲明。NO_ZERO_DATE / NO_ZERO_IN_DATE 禁止零值,插入零值報錯。SET sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,EXPLICIT_DEFAULTS_FOR_TIMESTAMP' 統一行為。created_at 用 DEFAULT CURRENT_TIMESTAMP,updated_at 用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。