J'ai deux tables, table1
est la table parent avec une colonne ID
et table2
une colonne IDFromTable1
(pas le nom réel) quand je mets un FK sur IDFromTable1
d' ID
en table1
je reçois l'erreur Foreign key constraint is incorrectly formed error
. Je voudrais supprimer l'enregistrement du tableau 2 si l' table1
enregistrement est supprimé. Merci pour toute aide
ALTER TABLE `table2`
ADD CONSTRAINT `FK1`
FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`)
ON UPDATE CASCADE
ON DELETE CASCADE;
Faites-moi savoir si d'autres informations sont nécessaires. Je suis nouveau sur mysql
table2.IDFromTable1
ettable1.ID
?Réponses:
J'ai rencontré ce même problème avec HeidiSQL. L'erreur que vous recevez est très cryptique. Mon problème a finalement été que la colonne de clé étrangère et la colonne de référence n'étaient pas du même type ou de la même longueur.
La colonne de clé étrangère était
SMALLINT(5) UNSIGNED
et la colonne référencée étaitINT(10) UNSIGNED
. Une fois que j'ai fait les deux le même type exact, la création de clé étrangère a parfaitement fonctionné.la source
J'ai eu le même problème lorsque la table parent a été créée à l'aide du
MyISAM
moteur. C'est une erreur stupide, que j'ai corrigée avec:la source
assurez-vous que les colonnes sont identiques (du même type) et si la colonne de référence ne l'est pas
primary_key
, assurez-vous qu'elle l'estINDEXED
.la source
KEY referencing_column(referencing_column)
AVANT les deux clés étrangères, elles ont été ajoutées avec succès :)La syntaxe pour définir les clés étrangères est très indulgente, mais pour quiconque trébuche là-dessus, le fait que les clés étrangères doivent être "du même type" s'applique même au classement, pas seulement au type de données, à la longueur et à la signature des bits.
Non pas que vous mélangiez le classement dans votre modèle (le feriez-vous?), Mais si vous le faites, assurez-vous que vos champs de clé primaire et étrangère sont du même type de classement dans phpmyadmin ou Heidi SQL ou tout ce que vous utilisez.
J'espère que cela vous évite les quatre heures d'essais et d'erreurs que cela m'a coûté.
la source
COLLATE utf8mb4_unicode_ci
mon problème (inattendu) (sur la machine de développement).J'ai eu le même problème, mais je l'ai résolu.
Assurez-vous simplement que la colonne 'ID' dans 'table1' a un index UNIQUE !
Et bien sûr, le type et la longueur des colonnes «ID» et «IDFromTable1» dans ces deux tables doivent être identiques. Mais vous le savez déjà.
la source
Juste pour terminer.
Cette erreur peut également être le cas si vous avez une clé étrangère avec VARCHAR (..) et que le jeu de caractères de la table référencée est différent de la table qui la référence.
Par exemple, VARCHAR (50) dans une table Latin1 est différent du VARCHAR (50) dans une table UTF8.
la source
Les textes d'erreur de mysql n'aident pas tellement, dans mon cas, la colonne avait une contrainte "not null", donc le "on delete set null" n'était pas autorisé
la source
si tout va bien, ajoutez simplement
->unsigned();
à la fin deforegin key
.si cela ne fonctionne pas, vérifiez le type de données des deux champs. ils doivent être les mêmes.
la source
J'ai eu le même problème, les deux colonnes étaient INT (11) NOT NULL mais je ne serais pas capable de créer la clé étrangère. J'ai dû désactiver les vérifications de clés étrangères pour l'exécuter avec succès:
J'espère que cela aide quelqu'un.
la source
Une autre cause probable pour l'affichage de cette erreur. L'ordre dans lequel je créais les tables était incorrect. J'essayais de référencer une clé d'une table qui n'était pas encore créée.
la source
(Dernier renvoi) Même si le nom du champ et le type de données sont identiques mais que le classement n'est pas le même, cela entraînera également ce problème.
Par exemple
Essayez de le changer en
....
Cela a fonctionné pour moi.
la source
Vérifiez le moteur des tables, les deux tables doivent être le même moteur, cela m'a beaucoup aidé.
la source
SHOW TABLE STATUS LIKE 'table_name';
J'ai eu les mêmes problèmes.
Le problème est que la colonne de référence n'est pas une clé primaire.
Faites-en une clé primaire et le problème est résolu.
la source
Bien que les autres réponses soient très utiles, je voulais simplement partager mon expérience également.
J'ai rencontré le problème lorsque j'ai supprimé une table dont la
id
référence était déjà en tant que clé étrangère dans d'autres tables ( avec des données ) et essayé de recréer / importer la table avec des colonnes supplémentaires.La requête de récréation (générée dans phpMyAdmin) ressemblait à ceci:
Comme vous pouvez le remarquer, l'
PRIMARY KEY
index a été défini après la création ( et l'insertion des données ) qui causait le problème.Solution
La solution consistait à ajouter l'
PRIMARY KEY
index sur la requête de définition de table pour leid
qui était référencé en tant que clé étrangère, tout en le supprimant également de laALTER TABLE
partie où les index étaient définis:la source
J'ai perdu des heures pour ça!
PK dans une table était
utf8
dans l'autre étaitutf8_unicode_ci
!la source
Essayez d'exécuter ce qui suit:
la source
J'ai eu le même problème avec Symfony 2.8.
Je ne l'ai pas compris au début, car il n'y avait pas de problèmes similaires avec la longueur int des clés étrangères, etc.
Enfin, j'ai dû faire ce qui suit dans le dossier du projet. (Un redémarrage du serveur n'a pas aidé!)
app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result
la source
merci S Doerin:
"Juste pour terminer. Cette erreur peut également être le cas si vous avez une clé étrangère avec VARCHAR (..) et que le jeu de caractères de la table référencée est différent de la table qui la référence. Par exemple, VARCHAR (50) dans une table Latin1 est différent du VARCHAR (50) dans une table UTF8. "
J'ai résolu ce problème, en changeant le type de caractères de la table. la création a latin1 et le correct est utf8.
ajoutez la ligne suivante. JEU DE CARACTÈRES PAR DÉFAUT = utf8;
la source
J'ai eu des problèmes avec Alter table pour ajouter une clé étrangère entre deux tables et la chose qui m'a aidé était de m'assurer que chaque colonne à laquelle j'essayais d'ajouter une relation de clé étrangère était indexée. Pour ce faire en PHP myAdmin: Allez dans le tableau et cliquez sur l'onglet structure. Cliquez sur l'option d'indexation pour indexer la colonne souhaitée comme indiqué dans la capture d'écran:
Une fois que j'ai indexé les deux colonnes que j'essayais de référencer avec mes clés étrangères, j'ai pu utiliser avec succès la table alter et créer la relation de clé étrangère. Vous verrez que les colonnes sont indexées comme dans la capture d'écran ci-dessous:
remarquez comment zip_code apparaît dans les deux tables.
la source
Vous devez vérifier que les deux sont identiques dans toutes ses propriétés, y compris dans "Collation"
la source
J'utilisais HeidiSQL et pour résoudre ce problème, j'ai dû créer un index dans la table référencée avec toutes les colonnes référencées.
la source
Je suis tombé sur le même problème tout à l'heure. Dans mon cas, tout ce que j'avais à faire est de m'assurer que la table à laquelle je fais référence dans la clé étrangère doit être créée avant la table actuelle (plus tôt dans le code). Donc, si vous faites référence à une variable (x * 5), le système doit savoir ce qu'est x (x doit être déclaré dans les premières lignes de code). Cela a résolu mon problème, j'espère que cela aidera quelqu'un d'autre.
la source
J'ai eu le même problème avec Laravel 5.1 migration Schema Builder avec MariaDB 10.1.
Le problème était que j'avais tapé
unigned
au lieu deunsigned
(las
lettre manquait) lors de la définition de la colonne.Après avoir corrigé l'erreur de frappe a été corrigée pour moi.
la source
Même moi, j'ai rencontré le même problème avec mysql et liquibase. Voici donc le problème: la table à partir de laquelle vous souhaitez référencer une colonne d'une autre table est différente soit en cas de type de données, soit en termes de taille du type de données.
la source
Vérifiez que vous avez spécifié le nom de la table dans la casse appropriée (si les noms de table sont sensibles à la casse dans votre base de données). Dans mon cas, j'ai dû changer
à
notez le
customer
changement enCUSTOMER
.la source
Ou vous pouvez utiliser DBDesigner4 qui a une interface graphique pour créer votre base de données et les relier à l'aide de FK. Faites un clic droit sur votre table et sélectionnez «Copier la table SQL Create» qui crée le code.
la source
C'est un vieux sujet mais j'ai découvert quelque chose. Lors de la construction d'un plan de travail MySQL, il obtient également les relations de l'autre table. laissez simplement les piliers auxquels vous vous rapportez. Effacez les autres colonnes ajoutées automatiquement. Cela fonctionne pour moi.
la source
Mon cas était que j'avais une faute de frappe sur la colonne référencée:
Le message d'erreur est assez cryptique et j'ai tout essayé - vérifier les types de colonnes, les classements, les moteurs, etc.
Il m'a fallu un certain temps pour noter la faute de frappe et après avoir corrigé tout a bien fonctionné:
la source
Je fais face à ce problème, l'erreur est survenue lorsque vous mettez la clé primaire dans un type de données différent comme:
Tableau 1:
Tableau 2:
le type de données pour l'id de la deuxième table doit être des incréments
la source
Le problème est très simple à résoudre
par exemple: vous avez deux tables avec des noms d' utilisateurs et de publications et vous voulez créer une clé étrangère dans la table des publications et vous utilisez phpMyAdmin
1) dans la table de publication , ajoutez une nouvelle colonne ( nom : use_id | type : comme l' id dans la table des utilisateurs | Longueur : comme l' id dans la table des utilisateurs | Par défaut : NULL | Attributs : unsigned | index: INDEX)
2) sur l' onglet Structure, allez à la vue relation ( Nom de la contrainte : défini automatiquement par phpmyAdmin | nom de la colonne : sélectionnez id_utilisateur | table : utilisateurs | clé : id, ...)
C'était simplement résolu
la source