MySQL创建带索引的表出错。

3

好的,我正在为MySQL创建带有索引和外键的表。我使用MySQL Workbench创建表,然后让它向前生成一个SQL创建脚本(在可视化数据库环境中比直接手写SQL代码要更好)。

问题是很多时候当我将SQL脚本导入到MySQL中时,我会遇到经典的错误:

#1005 - Can't create table 'db.tablename' (errno: 121) 

我已经成功找出了每次问题的原因,通常与索引/外键有关,但现在我开始对每次修复问题感到烦恼。我真的不理解问题是什么(尤其是当MySQL产品为其自己的数据库创建SQL代码时)。下面是通常会导致问题的一些代码。

CREATE  TABLE IF NOT EXISTS `db`.`groupMembers` (
  `groupMembersID` INT NOT NULL AUTO_INCREMENT ,
  `groupID` INT NOT NULL ,
  `userID` INT NULL ,
  PRIMARY KEY (`groupMembersID`) ,
  INDEX `group` (`groupID` ASC) ,
  INDEX `user` (`userID` ASC) ,
  CONSTRAINT `group`
    FOREIGN KEY (`groupID` )
    REFERENCES `db`.`groups` (`groupsID` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `user`
    FOREIGN KEY (`userID` )
    REFERENCES `db`.`users` (`usersID` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

这个错误通常来自于第一个INDEX定义,即使我删除了索引定义,我仍然会在第一个外键约束定义处得到错误。我已经检查过,外键远程列和本地列的数据类型和大小是相同的。

1个回答

4

"errno 121" 表示重复键错误。

数据库中的约束必须具有唯一名称,您可能需要更改外键名称。例如:FK_groupMembers_groupFK_groupMembers_user


谢谢 - 我更改了所有外键、索引名称,这样就修复了错误。这是否也适用于索引名称,还是只适用于特定的表? - Robert DeBoer
是的,每个实体(索引、表等)在整个数据库中都应该是唯一的。 - Fabian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接