web-dev-qa-db-fra.com

MySQL errno 121

Je reçois cette erreur dans MySQL create. Je fais:

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;

Des idées? Les états d'erreur: Can't create table './xxxxxxxx/blogReply.frm' (errno: 121)

37
Angel.King.47

Vérifiez que toutes vos contraintes sont correctement définies, vérifiez également qu'aucune autre table n'utilise les noms de contrainte FK_userId ou FK_blogId

120
nos

L'erreur 121 est un problème de contrainte de clé étrangère. La première chose à vérifier est que vos définitions de clé étrangère sont correctes (tous les noms de tables et de champs sont corrects, etc.).

Vous pouvez également essayer de désactiver les vérifications de clé étrangère avant de créer la table, comme ceci:

SET FOREIGN_KEY_CHECKS = 0;

Cela a l'inconvénient de générer des erreurs plus tard lorsque vous réactivez vos vérifications de clés (définissez-le sur 1), mais si tel est le cas, cela signifie que vous avez des enregistrements non valides quelque part qui interfèrent avec la création de la clé étrangère .

Cependant, ce problème peut également se produire si vous avez déplacé manuellement des fichiers de base de données, comme renommer physiquement le data/your_database_name répertoire. InnoDB ne peut pas corréler les changements physiques comme celui-ci avec le tablespace, donc il détruit avec les internes.

Si c'est ce que vous avez fait, la solution qui fonctionne le mieux est de ramener votre ancienne base de données là où elle était, d'effectuer un vidage ou de l'exporter, et de faire un DROP DATABASE dessus avant de réimporter.

7
zombat

Dans J'ai ce problème dans mysql 5.5 mais fonctionne très bien dans mysql 5.6. Le problème était dû au fait que le nom de la contrainte semble unique, mais s'il s'agit d'un nom long et tronqué, il devient non unique, par exemple:

long_constraint_name_1, long_constraint_name_2 pourrait devenir long_constraint_name_

1
user55993

veuillez vérifier que votre clé étrangère que vous créez est la même dans tous les aspects tels que le type de données avec la colonne de table référencée. Chaque nom de clé étrangère doit être unique pour les tables dans lesquelles il est créé, il ne doit pas être utilisé dans d'autres tables. pour le problème ci-dessus, le nom de la clé étrangère "FK_userId" ne doit être utilisé dans aucune autre table.

1
user1570577