MySQL 错误号 121

Posted

技术标签:

【中文标题】MySQL 错误号 121【英文标题】:MySQL errorno 121 【发布时间】:2010-11-13 22:02:54 【问题描述】:

我在创建 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)

【问题讨论】:

【参考方案1】:

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

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

SET FOREIGN_KEY_CHECKS = 0;

当您重新启用密钥检查(将其设置为 1)时,这具有稍后引发错误的缺点,但是,如果是这种情况,则意味着您在某处有一些无效记录干扰了外键。

但是,如果您一直在手动移动数据库文件,例如物理重命名 data/your_database_name 目录,也会出现此问题。 InnoDB 无法将这样的物理变化与表空间相关联,因此它与内部结构混淆。

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

【讨论】:

不,我没有实际移动 thisgs .. 我刚刚制作了一个安装文件并使用新副本重新运行它以创建所有表【参考方案2】:

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

【讨论】:

让我测试一下这个理论,因为我认为我之前命名了 FK_userId 但在不同的表中 很好,不知道外键需要通过表具有唯一的名称。谢谢:) 今天我多年来第一次使用 mySQL 遇到这个错误,现在。名字总是匹配的真是巧合。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

long_constraint_name_1, long_constraint_name_2 可能变成long_constraint_name_

【讨论】:

以上是关于MySQL 错误号 121的主要内容,如果未能解决你的问题,请参考以下文章

sql错误错误号:121

mysql错误:错误1018(HY000):无法读取'.'的目录(错误号:13)

MySql:错误 1018(HY000):无法读取 '.' 的目录(错误号:13)

MySql 错误 1005 错误号 22

MySQL Workbench 数据库错误

mysql无法启动! 错误号1067