首页 >数据库 >mysql教程 >为什么我在 MySQL 中收到'重复键约束违规”错误(错误 1022)?

为什么我在 MySQL 中收到'重复键约束违规”错误(错误 1022)?

Barbara Streisand
Barbara Streisand原创
2024-11-03 16:54:03418浏览

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