MySQL 限制:單表僅能有一個欄位使用 CURRENT_TIMESTAMP 相關屬性(含 DEFAULT CURRENT_TIMESTAMP 與 ON UPDATE CURRENT_TIMESTAMP)。且第一個定義為 NOT NULL 的 TIMESTAMP 欄位會被隱式加上 DEFAULT CURRENT_TIMESTAMP,導致雙欄位設定失敗。
createtime:Insert 時自動填入當前時間updatetime:Update 時自動更新為當前時間在 BEFORE INSERT、BEFORE UPDATE 觸發器中手動賦值。
DEFAULT 0 規避隱式預設值(推薦折衷)CREATE TABLE `device` (
`createtime` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '建立時間',
`updatetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間'
) ENGINE=InnoDB;
操作調整:
INSERT INTO device SET toid=11, createtime=NULL; -- 必須顯式傳 NULL 觸發 0 → 實際會存 0000-00-00,應用層需處理
UPDATE device SET toid=22 WHERE id=1; -- updatetime 自動更新
NULL 觸發,語意不直觀;0000-00-00 可能導致應用層報錯INSERT INTO device SET toid=11, createtime='2024-01-15 10:30:00', updatetime='2024-01-15 10:30:00';
UPDATE device SET toid=22, updatetime='2024-01-15 10:35:00' WHERE id=1;
若專案無跨資料庫遷移需求且接受觸發器,**方案一**最純粹;追求簡單可維護且避免 0000-00-00 坑,**方案三**是工業界主流選擇。