2009-07-24 3 views
35

Je reçois cette erreur dans MySQL créer. Je fais:MySQL errorno 121

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)

Répondre

116

Vérifiez que toutes vos contraintes sont vraiment orthographié correctement, vérifiez également qu'il n'y a pas d'autres tableaux qui utilise les noms de contrainte FK_USERID ou FK_blogId

+0

Laissez-moi tester cette théorie parce que je pense im nommer FK_userId avant mais dans une autre table –

+18

Nice, ne savait pas que les clés étrangères doivent avoir des noms uniques à travers des tables. Merci :) – Shade

+0

Aujourd'hui, j'ai eu cette erreur pour la première fois en utilisant mySQL depuis des années, maintenant. C'était vraiment une coïncidence que les noms correspondent toujours. –

7

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és étrangères sont correctes (tous les noms de tables et de champs sont corrects, etc.).

Vous pouvez essayer de désactiver les contrôles clés étrangères avant de créer la table et, comme celui-ci:

SET FOREIGN_KEY_CHECKS = 0; 

qui a l'inconvénient de jeter les erreurs plus tard, quand vous réactivez vos contrôles clés (mis à 1) Toutefois, 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.

Toutefois, ce problème peut également se produire si vous avez déplacé manuellement des fichiers de base de données, par exemple en renommant physiquement le répertoire data/your_database_name. InnoDB ne peut pas corréler les changements physiques comme ça à l'espace de table, donc il se faufile avec les internes. Si c'est ce que vous avez fait, la solution qui fonctionne le mieux est de déplacer votre ancienne base de données là où elle était, d'en faire un vidage ou une exportation, et de faire DROP DATABASE avant de réimporter.

+1

Non je ne suis pas physiquement thisgs se déplacer. Je viens de faire un fichier d'installation et de re courir avec une nouvelle copie pour créer toutes les tables –

1

s'il vous plaît vérifier que votre clé étrangère que vous créez est le même dans tous les aspects tel que le type de données avec la colonne de la 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 clé étrangère "FK_userId" ne doit pas être utilisé dans une autre table.

1

Dans j'ai ce problème dans mysql 5.5 mais fonctionne bien dans mysql 5.6. Le problème est que le nom de contrainte semble être unique, mais si cela est un nom long et est tronqué le devenir non unique, par exemple:

long_constraint_name_1, long_constraint_name_2 peut devenir long_constraint_name_