MySQL错误创建表时1022(MySQL error 1022 when creating tab

2019-07-20 08:13发布

MySQL工作台想出了下面的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,

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

Answer 1:

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

想象一下这样的情况

目录 - >供应商

产品 - >供应商

如果在表目录外键对供应商的名称是“供应商”和您分配在产品表上同一名称,则外键的名字将“碰撞”。

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

例如:

catalog_supplier product_supplier



Answer 2:

看来你要创建的外键列的索引。 当创建InnoDB的外键,系统将自动创建。

看到这个线程 。



Answer 3:

尝试使用INSERT IGNORE ,而不是INSERT ,其中INSERT忽略如果重复的主键被发现也不会插入新行。 这应该有助于解决暂时的问题,但我会建议截断表。



文章来源: MySQL error 1022 when creating table