DEFAULT CURRENT_TIMESTAMP 或 ON UPDATE CURRENT_TIMESTAMP,不可同時用於不同列典型報錯:ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
需同時記錄 created_at (創建時自動賦值) 和 updated_at (更新時自動刷新) 兩個時間戳列。
-- 表結構調整:updated_at 改為 DATETIME,去除自動屬性
CREATE TABLE `example` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 保留一個自動 TIMESTAMP
`lastUpdated` DATETIME NOT NULL, -- 改為 DATETIME 手動維護
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- 創建 BEFORE UPDATE 觸發器
DROP TRIGGER IF EXISTS `update_example_trigger`;
DELIMITER //
CREATE TRIGGER `update_example_trigger` BEFORE UPDATE ON `example`
FOR EACH ROW
BEGIN
SET NEW.`lastUpdated` = NOW(); -- 或 UTC_TIMESTAMP() 統一 UTC
END//
DELIMITER ;
優點:兼容 5.5,邏輯清晰可控。缺點:觸發器有微小性能開銷,DDL 變更需同步維護觸發器。
不依賴數據庫自動機制,應用層統一設置:
created_at = NOW(), updated_at = NOW()updated_at = NOW()配合 ORM 框架 (Hibernate @CreationTimestamp/@UpdateTimestamp, MyBatisPlus @TableField(fill=...), JPA @PrePersist/@PreUpdate) 實現零侵入自動填充。
5.6.5+ 直接支持:
CREATE TABLE `example` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`lastUpdated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
或 DATETIME 組合 (5.6.5+ 同樣支持):
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`lastUpdated` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Instant.now() (UTC 毫秒戳) 寫入 BIGINT 或 DATETIME(3),徹底擺脫數據庫時區/版本依賴