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中文网其他相关文章!