MySQLエラーTIMESTAMP column with CURRENT_TIMESTAMPの解決方法

2232 ワード

MySQL定義の例は、プログラムの導入時に発生した問題です.
 
  
CREATE TABLE `example` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `lastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

このSQLは私がプロジェクトから取り出したもので、テストマシンではすべて正常ですが、生産マシンに配備されています.MySQLはエラーを報告しました.
 
  
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.

CURRENTが1つしかないという意味ですTIMESTAMPのtimestamp列は存在するが、なぜローカルテストに問題がないのか、ローカルテストのマシンにインストールされているMySQLバージョン5.6.13、本番マシンにインストールされているバージョンは5.5で、ネットワークを検索したところ、この2つのバージョンの間でtimestamp処理の違いが分かった.
MySQL 5.5ドキュメントには、次のような言葉があります.
 
  
One TIMESTAMP column in a table can have the current timestamp as the default value for initializing the column, as the auto-update value, or both. It is not possible to have the current timestamp be the default value for one column and the auto-update value for another column.

MySQL 5.6.5では、次のように変更されました.
 
  
Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.

ネット上のソリューションに基づいて、トリガを使用して代替することができます.
 
  
CREATE TABLE `example` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `lastUpdated` DATETIME NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
DROP TRIGGER IF EXISTS `update_example_trigger`;
DELIMITER //
CREATE TRIGGER `update_example_trigger` BEFORE UPDATE ON `example`
 FOR EACH ROW SET NEW.`lastUpdated` = NOW()
//
DELIMITER ;