MySQL错误编号121

39

我在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;

有什么想法吗?错误提示为:无法创建'./xxxxxxxx/blogReply.frm'表(错误号:121)

4个回答

126

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


让我测试一下那个理论,因为我觉得我之前命名了FK_userId,但在另一个表里。 - Angel.King.47
20
好的,我会尽力给您翻译。对于外键需要跨表具有唯一名称这一点,我之前不知道。谢谢 :) - Shade
今天我使用MySQL多年来第一次遇到了这个错误。现在看来,名字总是匹配的确实是巧合。 - Markus Zeller

7

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

您还可以在创建表之前尝试禁用外键检查,像这样:

SET FOREIGN_KEY_CHECKS = 0;

这样做的缺点是,当您重新启用密钥检查(将其设置为1)时,会出现错误,然而,如果是这种情况,那么这意味着您某个地方有一些无效记录干扰了外键的创建。

然而,如果您手动移动数据库文件,例如物理重命名data/your_database_name目录,则也可能出现此问题。InnoDB无法将这样的物理更改与表空间相关联,因此它会搞乱内部结构。

如果您是这样做的,则最好的解决方案是将旧数据库移回原处,在导出之前使用DROP DATABASE进行删除,然后重新导入。


1
不,我并没有在物理上移动这些东西...我只是制作了一个安装文件,并使用全新的副本重新运行该文件以创建所有表。 - Angel.King.47

1
请确认您创建的外键在所有方面都与引用表列的数据类型相同。每个外键名称应该对于创建它的那些表是唯一的,不应该在任何其他表中使用。对于上述问题,"FK_userId" 外键名称不应该在任何其他表中使用。

1
在MySQL 5.5中,我遇到了这个问题,但在MySQL 5.6中却没有问题。问题是由于约束名称看起来是唯一的,但如果这是一个很长的名称并被截断,则变得不唯一,例如:

long_constraint_name_1long_constraint_name_2可能会变成long_constraint_name_


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