创建表时MySQL错误1022

时间:2013-02-22 00:05:32

标签: 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

对我来说很好看,我的数据库中有很多其他非常相似的表,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,

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

3 个答案:

答案 0 :(得分:65)

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

想象一下这种情况

目录 - >供应商

产品 - >供应商

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

您需要以不同方式命名..

例如:

catalog_supplier product_supplier

答案 1 :(得分:2)

您似乎在外键列上创建索引。在InnoDb中创建外键时,将自动创建一个。

See this thread

答案 2 :(得分:-2)

尝试使用INSERT IGNORE而不是INSERT,如果找到重复的主键,INSERT IGNORE将不会插入新行。这应该有助于临时解决问题,但我建议截断表。