21

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

这对我来说看起来不错,并且我的数据库中还有许多其他非常相似的表,MySQL 非常乐意创建这些表。

但是这个...

ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'

我一辈子都看不到这里有任何重复的键。只定义了一个键!

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

想法?

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

CONSTRAINT `error_id`
    FOREIGN KEY (`error_id` )
    REFERENCES `mydb`.`errors` (`error_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,

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

4

3 回答 3

71

问题是一个外键的名称不能与整个模型中的另一个外键相同。

想象一下这种情况

目录 --> 供应商

产品 --> 供应商

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

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

例如:

目录_供应商 产品_供应商

于 2013-03-30T21:46:50.837 回答
2

看来您正在外键列上创建索引。在 InnoDb 中创建外键时,会自动创建一个。

看到这个线程

于 2013-02-22T00:28:07.490 回答
-2

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

于 2013-02-22T00:22:11.103 回答