169 votes

MySQL : Impossible de créer une table (errno : 150)

J'essaie d'importer un fichier .sql et la création des tables échoue.

Voici la requête qui échoue :

CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;    

J'ai exporté le .sql de la même base de données, j'ai supprimé toutes les tables et maintenant j'essaie de l'importer, pourquoi cela échoue-t-il ?

MySQL : Impossible de créer la table './dbname/data.frm' (errno : 150)

1 votes

Pour l'essentiel des causes de cette erreur, voici une ressource exhaustive sur ce qui provoque l'errno 150 (et l'errno 121/autres erreurs de clé étrangère) dans MySQL.

21 votes

J'ai constaté que les colonnes doivent être identiques (même le drapeau non signé doit correspondre).

3 votes

@JohnSmith ... où ?

176voto

OMG Ponies Points 144785

De la MySQL - Documentation sur les contraintes FOREIGN KEY :

Si vous recréez une table qui a été abandonnée, elle doit avoir une définition conforme aux contraintes de clé étrangère qui la référencent. Elle doit avoir les noms et les types de colonnes corrects, et elle doit avoir des index sur les clés référencées, comme indiqué précédemment. Si ces conditions ne sont pas remplies, MySQL renvoie l'erreur 1005 et fait référence à l'erreur 150 dans le message d'erreur, ce qui signifie qu'une contrainte de clé étrangère n'a pas été formée correctement. De même, si un ALTER TABLE échoue en raison de l'erreur 150, cela signifie qu'une définition de clé étrangère serait incorrectement formée pour la table modifiée.

1 votes

Est-ce que deux colonnes d'une table peuvent faire référence à une colonne d'une autre table, où il s'agit de PK ?

1 votes

@Eugene : Chacune des deux colonnes peut avoir une relation de clé étrangère avec le PK dans une autre table -- mais pas les deux colonnes comme une seule relation de clé étrangère.

1 votes

@OMGPonies : Merci d'avoir répondu à cette question ! Je la cherchais... J'ai également posé une question ici. stackoverflow.com/questions/13487010/ ....Bien que j'aie de bonnes réponses, je veux être conforme. Whether its possible to write Nested Query for my problem Je vous demande de me répondre aussi !

103voto

Dan McGrath Points 9839

L'erreur 150 signifie que vous avez un problème avec votre clé étrangère. Il se peut que la clé de la table étrangère ne soit pas exactement du même type.

16 votes

Merci :) pour moi, les types de données sont INT mais l'un est non signé alors que l'autre ne l'est pas.

6 votes

Je tombe souvent sur BIGINT vs INT lors de l'utilisation de générateurs de schémas.

0 votes

J'ai rencontré le même problème lorsque la clé étrangère n'est pas une valeur INT. La colonne doit être UNIQUE lorsque la clé étrangère s'y réfère.

70voto

Denilson Sá Points 6953

Vous pouvez obtenir le message d'erreur réel en exécutant SHOW ENGINE INNODB STATUS; et ensuite chercher LATEST FOREIGN KEY ERROR dans la sortie.

Fuente: réponse d'un autre utilisateur à une question similaire

8 votes

C'est en fait très utile. Il vous indique l'erreur exacte.

0 votes

Merci. C'est dommage que MySQL Workbench ne l'utilise pas.

0 votes

C'est génial. C'est tellement utile. Il vous indique l'erreur exacte. La mienne était d'avoir rendu la colonne NULLABLE mais d'avoir défini "on delete set null". Merci beaucoup.

31voto

Les types de données doivent correspondre exactement. Si vous avez affaire à des types varchar, les tables doivent utiliser la même collation.

4 votes

Merci pour la collation.

24voto

pi. Points 391

Dans certains cas, vous pouvez rencontrer ce message d'erreur s'il existe des moteurs différents entre les tables concernées. Par exemple, une table peut utiliser InnoDB alors que l'autre utilise MyISAM. Les deux doivent être identiques

0 votes

Merci - c'était mon problème.

0 votes

C'était mon problème. Merci

0 votes

Cela peut se produire si vous avez créé un fichier sql de table innodb en utilisant mysqldump et qu'ils ont été exportés comme talbes myisam à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X