J'essaie d'importer un fichier .sql et son échec lors de la création de tables.
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'essaye de l'importer, pourquoi échoue-t-il?
MySQL: impossible de créer la table './dbname/data.frm' (errno: 150)
Réponses:
À partir de la documentation MySQL - FOREIGN KEY Constraints :
la source
Whether its possible to write Nested Query for my problem
? .. Je vous demanderais de me répondre aussi!L'erreur 150 signifie que vous avez un problème avec votre clé étrangère. Peut-être que la clé de la table étrangère n'est pas exactement du même type?
la source
BIGINT
vsINT
lors de l'utilisation de générateurs de schéma.Vous pouvez obtenir le message d'erreur réel en exécutant
SHOW ENGINE INNODB STATUS;
et en recherchantLATEST FOREIGN KEY ERROR
dans la sortie.Source: réponse d'un autre utilisateur à une question similaire
la source
Les types de données doivent correspondre exactement. Si vous utilisez des types varchar, les tables doivent utiliser le même classement.
la source
Je pense que toutes ces réponses, bien que correctes, induisent en erreur la question.
La vraie réponse est la suivante avant de démarrer une restauration, si vous restaurez un fichier de vidage avec des clés étrangères:
car naturellement la restauration créera des contraintes avant même que la table étrangère n'existe.
la source
Dans certains cas, vous pouvez rencontrer ce message d'erreur s'il existe différents moteurs entre les tables associées. Par exemple, une table peut utiliser InnoDB tandis que l'autre utilise MyISAM. Les deux doivent être identiques
la source
Erreur no. 150 signifie un échec de contrainte de clé étrangère. Vous créez probablement cette table avant la table dont dépend la clé étrangère (table
keywords
). Créez d'abord cette table et cela devrait fonctionner correctement.Si ce n'est pas le cas, supprimez l'instruction de clé étrangère et ajoutez-la après la création de la table - vous obtiendrez un message d'erreur plus significatif concernant l'échec de la contrainte spécifique.
la source
Il y a pas mal de choses qui peuvent causer l'erreur 150, donc pour les personnes qui recherchent ce sujet, voici ce que je pense être une liste presque exhaustive (source Causes de Errno 150 ):
Pour l'errno 150 ou l'errno 121, en tapant simplement SHOW ENGINE INNODB STATUS, il y a une section appelée "LATEST FOREIGN KEY ERROR". En dessous, cela vous donnera un message d'erreur très utile, qui vous dira généralement tout de suite quel est le problème. Vous avez besoin de privilèges SUPER pour l'exécuter, donc si vous ne l'avez pas, vous devrez simplement tester les scénarios suivants.
1) Les types de données ne correspondent pas: les types de colonnes doivent être les mêmes
2) Colonnes parentes non indexées (ou indexées dans le mauvais ordre)
3) Les classements de colonnes ne correspondent pas
4) Utilisation de SET NULL sur une colonne NOT NULL
5) Les classements de table ne correspondent pas: même si les classements de colonnes correspondent, sur certaines versions de MySQL, cela peut être un problème.
6) La colonne parent n'existe pas réellement dans la table parent. Vérifiez l'orthographe (et peut-être un espace au début ou à la fin de la colonne)
7) L'un des index de l'une des colonnes est incomplet ou la colonne est trop longue pour un index complet. Notez que MySQL (sauf si vous le modifiez) a une longueur maximale de clé de colonne unique de 767 octets (cela correspond à une colonne UTF varchar (255))
Dans le cas où vous obtenez un numéro d'erreur 121, voici quelques causes:
1) Le nom de la contrainte que vous avez choisi est déjà pris
2) Sur certains systèmes, s'il y a une différence de casse dans votre déclaration et les noms de table. Cela peut vous mordre si vous passez d'un serveur à un autre qui a des règles de gestion des cas différentes.
la source
Parfois, MySQL est tout simplement super stupide - je peux comprendre la cause des clés étrangères ... mais dans mon cas, je viens de supprimer toute la base de données et j'obtiens toujours l'erreur ... pourquoi? je veux dire, il n'y a plus de base de données ... et l'utilisateur sql que j'utilise n'a pas accès à d'autres bases de données sur le serveur ... je veux dire, le serveur est "vide" pour l'utilisateur actuel et je reçois toujours cette erreur? Désolé mais je suppose que MySQL me ment ... mais je peux m'en occuper :) Ajoutez simplement ces deux lignes de SQL autour de votre putain de déclaration:
Maintenant, le sql devrait être exécuté ... Si vous avez vraiment un problème de clé étrangère, il vous apparaîtrait par la ligne où vous réactiverez les vérifications - cela échouera alors .. mais mon serveur est juste silencieux :)
la source
Après avoir parcouru les réponses ci-dessus et expérimenté un peu, c'est un moyen efficace de résoudre les erreurs de clé étrangère dans MySQL (1005 - erreur 150).
Pour que la clé étrangère soit correctement créée, tout ce que MySQL demande est:
Répondez à ces exigences et tout ira bien.
la source
J'ai rencontré cette erreur lorsque j'ai porté l'application Windows sur Linux. Sous Windows, les noms de table de base de données sont insensibles à la casse, et sous Linux, ils le sont, probablement en raison de la différence du système de fichiers. Donc, sur la table Windows
Table1
est le même quetable1
, et dans lesREFERENCES
deuxtable1
etTable1
fonctionne. Sous Linux, lorsque l'application était utiliséetable1
au lieu deTable1
créer la structure de la base de données, j'ai vu l'erreur n ° 150; quand j'ai fait la bonne casse des caractères dans lesTable1
références, cela a commencé à fonctionner aussi sous Linux. Donc, si rien d'autre ne vous aide, assurez-vous queREFERENCES
vous utilisez la casse des caractères correcte dans le nom de la table lorsque vous utilisez Linux.la source
Changez les moteurs de vos tables, seule innoDB prend en charge les clés étrangères
la source
Si la table PK est créée dans un CHARSET et que vous créez ensuite une table FK dans un autre CHARSET..alors vous pourriez aussi obtenir cette erreur ... J'ai moi aussi cette erreur, mais après avoir changé le jeu de caractères en PK charset, il a été exécuté sans erreur
la source
Cette erreur peut se produire si deux tables ont une référence, par exemple, une table est Student et une autre table est Education, et nous voulons que la table Education ait une référence de clé étrangère de la table Student. Dans ce cas, le type de données de colonne pour les deux tables doit être le même, sinon cela générera une erreur.
la source
Dans la plupart des cas, le problème est dû à la différence MOTEUR .Si le parent est créé par InnoDB, les tables référencées supposées être créées par MyISAM et vice versa
la source
Dans mon cas. J'ai eu des problèmes avec le moteur et le jeu de caractères car mon serveur d'hébergement change les paramètres et mes nouvelles tables étaient MyISAM mais mes anciennes tables sont InnoDB. Juste j'ai changé.
la source
La clé étrangère doit avoir le même type de données que la clé primaire . En outre, si la clé primaire n'est pas signée, la clé étrangère doit également être non signée .
la source
J'ai eu le même problème. Il était lié à la colonne de la table Collation et jeu de caractères . Assurez-vous que le jeu de caractères et le classement doivent être identiques pour les deux colonnes de deux tables. Si vous souhaitez définir une clé étrangère sur cela. Exemple - Si vous placez une clé étrangère sur la colonne userID de la table userImage référençant la colonne userID de la table users, le classement doit être le même que utf8_general_ci et le jeu de caractères utf8 pour les deux colonnes des tables. Généralement, lorsque vous créez une table, mysql prend ces deux configurations à partir des paramètres du serveur.
la source
Veuillez vous assurer que votre colonne de clé primaire et votre colonne référencée ont les mêmes types de données et attributs (non signé, binaire, zerofill non signé, etc.).
la source
Un cas réel est celui où vous avez utilisé un outil MySQL (Sequel Pro dans mon cas) pour renommer une base de données. Puis créé une base de données avec le même nom.
Cela gardait les contraintes de clé étrangère sur le même nom de base de données, de sorte que la base de données renommée (par exemple, my_db_renamed) avait des contraintes de clé étrangère dans la base de données nouvellement créée (my_db)
Je ne sais pas s'il s'agit d'un bogue dans Sequel Pro, ou si un cas d'utilisation nécessite ce comportement, mais cela m'a coûté la meilleure partie de la matinée: /
la source
J'ai eu la même erreur. Dans mon cas, la raison de l'erreur était que j'avais une instruction ON DELETE SET NULL dans la contrainte tandis que le champ sur lequel j'ai mis la contrainte dans sa définition avait une instruction NOT NULL. Autoriser NULL dans le champ a résolu le problème.
la source
J'ai rencontré ce genre de problème lors de la création de DB à partir du fichier texte.
Je viens d'écrire les lignes ci-dessus
Create.bat
et d'exécuter le fichier bat.Mon erreur est dans l'ordre de séquence d'exécution dans mes fichiers sql. J'ai essayé de créer une table avec une clé primaire et une clé étrangère. Pendant son exécution, il recherchera la table de référence mais les tables n'y sont pas. Il renverra donc ce genre d'erreur.
la source
J'ai eu un problème similaire, mais le mien était dû au fait que j'ajoutais un nouveau champ à une table existante contenant des données et que le nouveau champ faisait référence à un autre champ de la table parent et avait également la définition de NOT NULL et sans aucune valeur par défaut. - J'ai découvert que les choses ne fonctionnaient pas parce que
Il est important de se rappeler que dans des circonstances normales, si vous planifiez votre base de données bien à l'avance et implémentez des contraintes avant l'insertion de données, ce scénario particulier serait évité
L'approche la plus simple pour éviter ce piège est de
J'espère que ça aidera quelqu'un
la source
Peut - être ceci aidera ? La définition de la colonne de clé primaire doit être exactement la même que celle de la colonne de clé étrangère.
la source
Assurez-vous que toutes les tables peuvent prendre en charge la clé étrangère - moteur InnoDB
la source
La colonne de la table PARENT à laquelle vous faites référence à partir de la table enfant doit être unique. Si ce n'est pas le cas, provoque une erreur n ° 150.
la source
J'ai eu un problème similaire lors du vidage d'une base de données Django mysql avec une seule table. J'ai pu résoudre le problème en vidant la base de données dans un fichier texte, en déplaçant la table en question à la fin du fichier à l'aide d'emacs et en important le fichier de vidage sql modifié dans la nouvelle instance.
HTH Uwe
la source
J'ai corrigé le problème en faisant accepter la variable
null
la source
J'ai eu le même problème lors de l'exécution d'une série de commandes MySQL. Le mien se produit lors de la création d'une table lors du référencement d'une clé étrangère vers une autre table qui n'a pas encore été créée. C'est la séquence d'existence de la table avant le référencement.
La solution: créez d'abord les tables parentes avant de créer une table enfant qui a une clé étrangère.
la source
Créez la table sans clé étrangère, puis définissez la clé étrangère séparément.
la source