MySQL Workbenchは、テーブルを作成するために次のSQLを考え出しました。
CREATE TABLE IF NOT EXISTS `mydb`.`errors_reports` (
`error_id` INT NOT NULL ,
`report_short` VARCHAR(15) NOT NULL ,
PRIMARY KEY (`error_id`, `report_short`) ,
INDEX `error_id_idx` (`error_id` ASC) ,
INDEX `report_short_idx` (`report_short` ASC) ,
CONSTRAINT `error_id`
FOREIGN KEY (`error_id` )
REFERENCES `mydb`.`errors` (`error_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `report_short`
FOREIGN KEY (`report_short` )
REFERENCES `mydb`.`reports` (`report_short` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
これは私には問題なく見えますが、MySQLが完全に喜んで作成したデータベースには、非常によく似た他のテーブルがたくさんあります。
しかし、これは...
ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'
私の人生では、重複したキーはここにありません。定義されているキーは1つだけです!
MySQL 5.6を新規デフォルトインストールで実行しています。エラーログには何もありません。
アイデア?
編集:消去のプロセスを通じて(テーブルの可能な限り単純な定義に戻り、徐々にビットを追加して戻します)、問題は次のビットのようです。
CONSTRAINT `error_id`
FOREIGN KEY (`error_id` )
REFERENCES `mydb`.`errors` (`error_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
他のいくつかのテーブル定義に同じコードがあり、それらは完全に問題ないので、これは特に奇妙です!
問題は外部キーの名前が同じ別の外部キーにできないことですモデル。
この状況を想像してください
カタログ->サプライヤー
製品->サプライヤー
サプライヤのテーブルカタログの外部キーの名前が「サプライヤ」であり、製品テーブルで同じ名前を割り当てた場合、外部キーの名前は「衝突」します。
それらに異なる名前を付ける必要があります。
例えば:
catalog_supplier product_supplier
外部キー列にインデックスを作成しているようです。 InnoDbで外部キーを作成すると、自動的に作成されます。