web-dev-qa-db-ja.com

テーブル作成時のMySQLエラー1022

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,

他のいくつかのテーブル定義に同じコードがあり、それらは完全に問題ないので、これは特に奇妙です!

20
Matt McLeod

問題は外部キー名前同じ別の外部キーにできないことですモデル。

この状況を想像してください

カタログ->サプライヤー

製品->サプライヤー

サプライヤのテーブルカタログの外部キーの名前が「サプライヤ」であり、製品テーブルで同じ名前を割り当てた場合、外部キーの名前は「衝突」します。

それらに異なる名前を付ける必要があります。

例えば:

catalog_supplier product_supplier

66
Christian Adam

外部キー列にインデックスを作成しているようです。 InnoDbで外部キーを作成すると、自動的に作成されます。

このスレッドを参照

2
Kermit