ホームページ >データベース >mysql チュートリアル >MySQL で「重複キー制約違反」エラー (エラー 1022) が発生するのはなぜですか?

MySQL で「重複キー制約違反」エラー (エラー 1022) が発生するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 16:54:03427ブラウズ

Why am I getting a

MySQL の重複キー制約違反: エラー 1022

MySQL Workbench はテーブルを作成するために次の SQL コードを生成しました:

<code class="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</code>

実行すると、このクエリは次のように失敗します。エラー:

<code class="sql">ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'</code>

分析

当初、主キーが 1 つだけ定義されていたため、主キーの定義は有効であるように見えました。ただし、問題は 外部キー制約名 (error_id および report_short) にあります。

解決策

MySQL では外部キー制約を許可しません。データベース全体で同じ名前を持ちます。 errors_reports テーブルには他のテーブルを参照する 2 つの外部キー制約があるため、それらの制約名が一意であることを確認する必要があります。

エラーを解決するには、外部キー制約の 1 つまたは両方の名前を変更します。たとえば、「error_id」の代わりに「error_id_ref」という名前を付けることもできます。

<code class="sql">CONSTRAINT `error_id_ref`
   FOREIGN KEY (`error_id` )
   REFERENCES `mydb`.`errors` (`error_id` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION,
CONSTRAINT `report_short_ref`
   FOREIGN KEY (`report_short` )
   REFERENCES `mydb`.`reports` (`report_short` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)</code>

概要

重複キーに関連する MySQL エラー 1022 が発生した場合は、プライマリ キーだけでなく、キー定義だけでなく、外部キー制約の名前も含まれます。これらの制約に一意の名前が付いていることを確認すると、エラーの発生を防ぐことができます。

以上がMySQL で「重複キー制約違反」エラー (エラー 1022) が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。