2013-02-22 17 views
18

のMySQL Workbenchは、テーブルを作成するには、以下のSQLを思い付い作成するのがとても嬉しかったです。MySQLエラー1022テーブルを作成

しかし、この1 ...

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, 

として特に奇数:消去のプロセスは、(テーブルの最も単純な定義に戻って、徐々にバックのビットを追加すること)を介して問題は、このビットであると思われます他のいくつかのテーブル定義には同じコードがあり、それらは完全に大丈夫です!

+0

...らしいです –

+0

FK列の索引を明示的に作成する必要があるかどうかは不明です。参照を作成するとインデックスが作成されるという印象を受けました。 – Kermit

+0

INDEXステートメントを引き出すことで違いはありません。 –

答えて

-1

INSERTの代わりにINSERT IGNOREを使用してください。重複する主キーが見つかるとINSERT IGNOREは新しい行を挿入しません。これは一時的に問題を解決するのに役立ちますが、テーブルを切り捨てることをお勧めします。

+0

これはデータを挿入するのではなく、テーブルを作成しています。ここにINSERTはありません。 –

+0

その間違いなく外国の鍵の問題(私のためのエラー105)。外部キーと参照先の列の照合、デフォルト属性などのデータ型が同じであることを確認してください。 –

2

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

See this thread

+0

このコードはMySQL Workbenchによって作成されたもので、明示的に追加されているようです。それは何の違いもありません。 –

+0

@MattMcLeodテーブルの作成後に制約を作成できますか?また、テーブル作成の前後に[インデックスのチェック](http://stackoverflow.com/a/5213364/679449)を試すことができますか? – Kermit

+1

Aha!これは、私が解決策と信じていることにつながります。別のテーブルにはすでに同じ制約が適用されています:error_id、そしてWorkbenchは両方とも同じ制約名を与えました。制約名を変更すると、その制約名が作成されました。 –

59

問題は、名前外部キーをすることはできません同じとしてモデル全体で別の外部キー

この状況

カタログ想像 - サプライヤーのためのテーブルのカタログ内の外部キーの名前は「サプライヤー」であり、あなたが同じことを割り当てた場合>サプライヤー

- >サプライヤー

製品をプロダクトテーブルの名前であれば、外部キーの名前は「衝突」します。

あなたは、これらを別の名前を付ける必要があります..例えば

:他の何かが起こっがあるかもしれないよう

catalog_supplier product_supplierは、私はこのクエリで問題ありません

+0

ありがとう!同じ問題を抱えていて、エラー・マッサージを考えると理解できませんでした。 BTWでは、衝突する外部キーの名前は列名と同じではなく、キーの内部MySql名と同じです。 – uzilan

+2

これが答えです!すばらしいです! –

+1

MySQLにその制約が存在する理由を知っていますか? – vipw

関連する問題