【发布时间】:2013-02-07 12:07:07
【问题描述】:
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,
这特别奇怪,因为在其他几个表定义中有相同的代码,而且完全没问题!
【问题讨论】:
-
我对这个查询没有任何问题.. 好像还有其他事情发生
-
不确定是否必须为 FK 列显式创建索引。我的印象是创建引用会创建一个索引。
-
取出 INDEX 语句没有任何区别。
标签: mysql mysql-workbench