2009-08-20 69 views
3

好吧,所以我在MySQL中创建索引和外键的表。我使用MySQL Workbench来创建表格,然后让它正向工程设计一个SQL创建脚本(在可视化DB环境中,我的工作比刚刚用手写出SQL代码更好)。MySQL创建表索引错误

的问题是很多时候我导入SQL脚本到MySQL,我得到了经典eror:

#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; 

错误通常来自于第一索引定义 - 甚至当我拿出索引定义,我只是在第一个外键约束定义得到的错误。我检查过了,外键远程列和本地列是相同的数据类型和大小。

回答

4

“错误号121指的是重复键错误”

约束必须在数据库中唯一的名字,你可能想改变你的FK名称。像这样,FK_groupMembers_groupFK_groupMembers_user

+0

谢谢 - 我改变了我的所有外键,索引名称,并修复了错误。这是否也适用于索引名称,还是仅限于表格特定? – 2009-08-24 15:17:42

+0

是的,每个实体(索引,表等)在整个数据库中都应该是唯一的)。 – Fabian 2009-08-24 16:16:17