エラー1022-書き込みできません。テーブルの重複キー


218

テーブル作成コマンドの重複キーに関して1022エラーが発生します。クエリを確認したところ、重複が発生している場所を理解できません。他の誰かがそれを見ることができますか?

SQL query:

-- -----------------------------------------------------
-- Table `apptwo`.`usercircle`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS  `apptwo`.`usercircle` (

 `idUserCircle` MEDIUMINT NOT NULL ,
 `userId` MEDIUMINT NULL ,
 `circleId` MEDIUMINT NULL ,
 `authUser` BINARY NULL ,
 `authOwner` BINARY NULL ,
 `startDate` DATETIME NULL ,
 `endDate` DATETIME NULL ,
PRIMARY KEY (  `idUserCircle` ) ,
INDEX  `iduser_idx` (  `userId` ASC ) ,
INDEX  `idcategory_idx` (  `circleId` ASC ) ,
CONSTRAINT  `iduser` FOREIGN KEY (  `userId` ) REFERENCES  `apptwo`.`user` (
`idUser`
) ON DELETE NO ACTION ON UPDATE NO ACTION ,
CONSTRAINT  `idcategory` FOREIGN KEY (  `circleId` ) REFERENCES  `apptwo`.`circle` (
`idCircle`
) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = INNODB;

MySQL said: Documentation

#1022 - Can't write; duplicate key in table 'usercircle' 

4
私の記憶が正しければ、主キーも常に一意のインデックスなので、一意のインデックスステートメントを削除する必要がありますか?
Mr47 2013

1
ON DELETE NO ACTION外部キーの使用全体を削除するだけです。それを行う非常に具体的な理由がない限り。
AmazingDreams 2013

4
@AmazingDreamsなんで?それでも参照整合性は適用されます。あなただけが自分で子供を削除する必要があります。これは、誤ったキーワードを1つ削除して誤って大量のデータを削除してしまうカスケード削除よりも安全です。
GolezTrol 2013

1
stackoverflow.com/a/5810024/1567737 'aliased'を使用するときにエイリアスを使用すると、目的がすぐに明確になるのはなぜですか?
AmazingDreams 2013

@AmazingDreams先端をありがとう。私はそれについての議論も好きです-それは長所と短所について学ぶのに役立ちます。
Git可能な

回答:


534

ほとんどの場合、名前iduserまたはidcategoryデータベースにすでに制約があります。もしそうなら、制約の名前を変更してください。

制約は、作成または変更する特定のテーブルだけでなく、データベース全体で一意である必要があります。

制約が現在使用されている場所を見つけるには、次のクエリを使用できます。

SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');

15
まさにあなたが言ったように。多くの制約は、残りのCREATEクエリで同じidcategory iduser名で自動生成されました-ご協力ありがとうございます!
Git可能な

1
MySQL Workbenchは作成スクリプトをエクスポートするときにこれを修正するだろうと思っていましたが、プロジェクトを開いたときにこの種の警告を「無視」することでそれが得られます。
SnowInferno 2014年

ありがとう、メイト:)それは私に大いに役立ち、今では外部キーの私の慣習は異なり、私はこの問題に再び会うことができません:)

確認できます。しかし、参照されたテーブルがすでに削除されているにもかかわらず、名前付き制約が存在する場合はどうすればよいですか?存在しないテーブルから制約を削除できますか?MySQL 5.6から最新のMariaDBにアップデートする必要があると思います。
Anse

3
ありがとうございます:制約はデータベース全体で一意である必要があります
sebasira

31

MySQLで外部キー名を変更します。データベーステーブルで同じ外部キー名を持つことはできません。

すべてのテーブルとすべての外部キーを確認し、正確に同じ名前の2つの外部キーを使用しないようにします。


それが私の場合の問題でした。私はそれを決して推測しなかったでしょう、そしてあなたは私の日を救いました。現在、fk_id_1、fk_id_2などを使用しています。ありがとう。
JackLeEmmerdeur 16

15

2つのリンクResolved SuccessfullyNaming Conventionから、私が直面したこの同じ問題を簡単に解決しました。つまり、外部キー名については、fk _colName_ TableNameと指定します。この命名規則は明確であり、DBモデル内のすべてのForeignKeyを一意にするため、このエラーが発生することはありません。

エラー1022:書き込めません。テーブルの重複キー


6

他の人が述べたように、制約の名前がDBの別のテーブルですでに使用されいる可能性があります。それらはデータベース全体で一意である必要があります。

外部キー制約に名前を付けるための適切な規則は次のとおりです。

fk_TableName_ColumnName

衝突の可能性があるかどうかを調査するには、次のクエリを使用して、データベースで使用されているすべての制約を一覧表示できます。

SELECT * FROM information_schema.table_constraints WHERE constraint_schema = 'YOUR_DB';

このクエリを実行したとき、以前にテーブルの一時的なコピーを作成しており、このコピーが使用しようとした制約名を既に使用していることがわかりました。


4

私は同じ問題で過去4時間過ごしました。私がしたことは、制約が一意の名前を持っていることを確認することでした。

制約の名前を変更できます。出現回数を簡単に追跡できるように、番号を追加しました。

テーブルの制約に、外部キーXを持つboyという名前が付けられている場合、外部キーXを持つ次の制約は、boy1と呼ばれます。

きっとあなたは私よりも良い名前がわかると思います。🙂


3

これは、Percona Toolkitのオンラインスキーマ変更ツールの特定のバージョンのバグに関連して発生することもあります。大きなテーブルを変更するには、pt-oscは最初に複製テーブルを作成し、すべてのレコードをそのテーブルにコピーします。状況によっては、pt-osc 2.2.xのバージョンによっては、新しいテーブルの制約に古いテーブルの制約と同じ名前を付けようとすることがあります。

修正は2.3.0でリリースされました。

詳細については、https://bugs.launchpad.net/percona-toolkit/+bug/1498128を参照してください。


1

私もその問題に遭遇しました。データベース名がMysqlにすでに存在するかどうかを確認し、古い名前に変更します。


1

新しいテーブルを作成するときにこの問題が発生しました。私が付けた外部キー名はすでに使用されていることがわかりました。キーの名前を変更すると修正されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.