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这应该有助于暂时解决问题,但我建议截断表。