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