38

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

4 に答える 4

123

すべての制約が実際に正しく記述されていることを確認します。また、制約名FK_userIdまたはFK_blogIdを使用する他のテーブルがないことも確認します。

于 2009-07-24T23:46:18.873 に答える
7

エラー 121 は外部キー制約の問題です。最初に確認することは、外部キーの定義に問題がないことです (すべてのテーブルとフィールド名が正しいなど)。

次のように、テーブルを作成する前に外部キー チェックを無効にすることもできます。

SET FOREIGN_KEY_CHECKS = 0;

これには、後でキー チェックを再度有効にする (1 に設定する) ときにエラーがスローされるという欠点がありますが、この場合は、外部キーの作成を妨げている無効なレコードがどこかにあることを意味します。 .

ただし、この問題は、ディレクトリの名前を物理的に変更するなど、データベース ファイルを手動で移動した場合にも発生する可能性がありますdata/your_database_name。InnoDB は、そのような物理的な変更をテーブルスペースに関連付けることができないため、内部をいじります。

これがあなたが行ったことである場合、最も効果的な解決策は、古いデータベースを元の場所に戻し、そのダンプまたはエクスポートを取得し、DROP DATABASE再インポートする前に実行することです。

于 2009-07-24T23:40:01.880 に答える
1

mysql 5.5 でこの問題が発生しましたが、mysql 5.6 では問題なく動作します。問題は、制約名が一意に見えるためですが、これが長い名前で切り捨てられた場合、次のように一意ではなくなります。

long_constraint_name_1long_constraint_name_2 なる可能性がありますlong_constraint_name_

于 2016-01-04T19:24:48.437 に答える