创建表时MySQL错误1022

Mat*_*eod 20 mysql mysql-workbench

MySQL Workbench提出了以下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
Run Code Online (Sandbox Code Playgroud)

这看起来很好,我的数据库中有很多其他非常相似的表,MySQL非常乐意创建.

但这一个......

ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活看到任何重复的钥匙在这里.只定义了一个键!

我正在使用新的默认安装运行MySQL 5.6.错误日志中没有任何内容.

想法?

编辑:通过一个消除过程(回到最简单的表定义,然后逐渐添加位),问题似乎是这一点:

CONSTRAINT `error_id`
    FOREIGN KEY (`error_id` )
    REFERENCES `mydb`.`errors` (`error_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
Run Code Online (Sandbox Code Playgroud)

这是特别奇怪的,因为在其他几个表定义中有相同的代码,那些完全没问题!

Chr*_*dam 67

问题是,该一的外键不能其它外键在整个模型.

想象一下这种情况

目录 - >供应商

产品 - >供应商

如果供应商的表目录中的外键名称是"供应商",并且您在产品表中分配了相同的名称,则外键名称将"冲突".

你需要以不同的方式命名它们.

例如:

catalog_supplier product_supplier


jac*_*cki -2

如果发现重复的主键,请尝试使用INSERT IGNOREINSERT IGNORE代替INSERT IGNORE 将不会插入新行。INSERT这应该有助于暂时解决问题,但我建议截断表。