首頁  >  文章  >  資料庫  >  為什麼我在 MySQL 中收到「重複鍵約束違規」錯誤(錯誤 1022)?

為什麼我在 MySQL 中收到「重複鍵約束違規」錯誤(錯誤 1022)?

Barbara Streisand
Barbara Streisand原創
2024-11-03 16:54:03373瀏覽

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>

分析

最初,主鍵定義似乎有效,因為只有定義了一個主鍵。但是,問題在於外鍵約束名稱(error_id 和report_short)。

解決方案

MySQL 不允許外鍵約束在整個資料庫中具有相同的名稱。由於表errors_reports有兩個外鍵約束引用其他表,因此需要確保它們的約束名稱是唯一的。

要解決錯誤,請重新命名一個或兩個外鍵約束。例如,可以將其命名為“error_id_ref”,而不是“error_id”。

範例

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn