MySQL错误号121

我在MySQL创build中出现这个错误。 我正在做:

CREATE TABLE `blogReply` ( `Id` INT(24) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key of This Table', `blogId` INT(24) NOT NULL COMMENT 'Blog where this reply was posted', `userId` INT(24) NULL COMMENT 'User the blog was posted by', `name` VARCHAR(100) NULL DEFAULT 'Unknown' COMMENT 'The Name of the user that the reply was posted by', `email` VARCHAR(100) NULL DEFAULT 'Unknown' COMMENT 'The Email of the user that the reply was posted by', `http` VARCHAR(300) NULL DEFAULT 'Unknown' COMMENT 'The Webaddress of the user that the reply was posted by', `message` TEXT NOT NULL COMMENT 'text of the blog', `votes` INT(10) DEFAULT 0 COMMENT 'Rating of the Blog', `ratedBy` TEXT COMMENT 'People who have already Voted on this blog', `dateReg` BIGINT NOT NULL COMMENT 'Date the User was Registered', PRIMARY KEY (`Id`), CONSTRAINT `FK_userId` FOREIGN KEY(`userId`) REFERENCES `user` (`Id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `FK_blogId` FOREIGN KEY(`blogId`) REFERENCES `blog` (`Id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE = InnoDB; 

有任何想法吗? 错误状态: Can't create table './xxxxxxxx/blogReply.frm' (errno: 121)

检查你所有的约束是否被正确拼写出来,同时检查是否没有其他使用约束名称的表FK_userId或FK_blogId

错误121是一个外键约束问题。 首先要检查的是你的外键定义是好的(所有的表和字段名都是正确的,等等)。

在创build表之前,您可以尝试禁用外键检查,如下所示:

 SET FOREIGN_KEY_CHECKS = 0; 

当你重新启用密钥检查(将其设置为1)时,会有抛出错误的缺点,但是,如果是这种情况,那么这意味着你有一些无效的logging干扰了创build外键。

但是,如果您已经手动移动数据库文件(例如物理重命名data/your_database_name目录),也会发生此问题。 InnoDB不能将像这样的物理变化与表空间相关联,所以它会与内部分离。

如果这是您所做的,那么最好的解决scheme是将您的旧数据库移回到原来的位置,进行转储或导出,并在重新导入之前对其执行DROP DATABASE

请检查你正在创build的外键在所有方面都是一样的,例如与引用表列的数据types。 每个外键名称对于创build它们的表格应该是唯一的,不应该在其他表格中使用。 对于上述问题,外键名称“FK_userId”不应该用在任何其他表中。

在MySQL 5.5中有这个问题,但在MySQL 5.6中正常工作。 问题是因为约束名称看起来是唯一的,但如果这是一个长名称并被截断成为非唯一的,例如:

long_constraint_name_1long_constraint_name_2可能变成long_constraint_name_