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 サイトの他の関連記事を参照してください。