MySQL错误121

时间:2009-07-24 23:30:53

标签: mysql foreign-keys mysql-error-1005

我在MySQL创建中遇到此错误。我在做:

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)

4 个答案:

答案 0 :(得分:119)

检查所有约束是否确实拼写正确,还要检查是否没有任何其他表使用约束名称FK_userId或FK_blogId

答案 1 :(得分:7)

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

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

SET FOREIGN_KEY_CHECKS = 0;

当您重新启用密钥检查(将其设置为1)时,这会产生向下抛出错误的缺点,但是,如果是这种情况,那么这意味着您在某处干扰了创建的某些无效记录外键。

但是,如果您手动移动数据库文件(例如物理重命名data/your_database_name目录),也会发生此问题。 InnoDB无法将类似物理变化与表空间相关联,因此它与内部结构混杂在一起。

如果这是您所做的,那么最有效的解决方案是将旧数据库移回原来的位置,转储或导出它,然后在重新导入之前对其执行DROP DATABASE

答案 2 :(得分:1)

请检查您创建的外键在所有方面是否相同,例如带有引用表列的数据类型。每个外键名称对于创建它的那些表应该是唯一的,不应该在任何其他表中使用。对于上述问题,外键名称“FK_userId”不应在任何其他表中使用。

答案 3 :(得分:1)

我在mysql 5.5中遇到此问题,但在mysql 5.6中工作正常。问题是因为约束名称看起来是唯一的,但如果这是一个长名称并被截断则变为非唯一,例如:

long_constraint_name_1long_constraint_name_2可能会成为long_constraint_name_