Tableau 1
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| UserID | int(11) | NO | PRI | NULL | auto_increment |
| Password | varchar(20) | NO | | | |
| Username | varchar(25) | NO | | | |
| Email | varchar(60) | NO | | | |
+----------+-------------+------+-----+---------+----------------+
Tableau 2
+------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+----------------+
| UserID | int(11) | NO | MUL | | |
| PostID | int(11) | NO | PRI | NULL | auto_increment |
| Title | varchar(50) | NO | | | |
| Summary | varchar(500) | NO | | | |
+------------------+--------------+------+-----+---------+----------------+
Erreur:
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:
Cannot add or update a child row: a foreign key constraint fails
(`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`)
REFERENCES `table1` (`UserID`))
Qu'est ce que j'ai mal fait? J'ai lu http://www.w3schools.com/Sql/sql_foreignkey.asp et je ne vois pas ce qui ne va pas.
table2.UserID
qui n'existe pas danstable1.UserID
.Réponses:
Vous obtenez cette erreur car vous essayez d'ajouter / de mettre à jour une ligne
table2
qui n'a pas de valeur valide pour leUserID
champ en fonction des valeurs actuellement stockées danstable1
. Si vous publiez plus de code, je peux vous aider à diagnostiquer la cause spécifique.la source
Cela signifie que vous essayez d'insérer dans
table2
uneUserID
valeur qui n'existe pas danstable1
.la source
Un simple piratage peut être de désactiver les vérifications de clé étrangère avant d'effectuer toute opération sur la table. Requête simplement
Cela désactivera la correspondance de clé étrangère avec toutes les autres tables. Une fois que vous avez terminé avec le tableau, réactivez-le
Cela fonctionne pour moi plusieurs fois.
la source
J'ai découvert un autre cas étrange: si vous créez accidentellement une clé étrangère d'une table InnoDB vers une table MyISAM, MySQL génère cette erreur au moment de l'insertion même si les données sont valides par ailleurs.
Voir http://nick.zoic.org/art/mysql-foreign-key-error/
la source
Vous obtenez cette erreur car il y a une valeur int
table2.UserID
qui n'existe pastable1.UserID
(je suppose que vous aveztable2.UserID
défini la valeur manuellement avant de créer cette clé étrangère).Un exemple pour cette scène:
table1.UserID
obtenir les valeurs 1,2,3 ettable2.UserID
obtenir les valeurs 4 (ajouter manuellement). Ainsi, lorsque vous créez une clé étrangère, ils ne peuvent pas trouver àUserID = 4
partir detable1
et l'erreur se produira.Pour corriger cette erreur, supprimez simplement
UserID = 4
detable2
ou vous pouvez vider les deux, puis créer la clé étrangère et.Bonne chance!
la source
Cela m'a pris un certain temps à comprendre. En termes simples, la table qui fait référence à l'autre table contient déjà des données et une ou plusieurs de ses valeurs n'existent pas dans la table parent.
Par exemple, le tableau 2 contient les données suivantes:
Tableau 1
Si vous essayez d'ALTER table2 et ajoutez une clé étrangère, la requête échouera car UserID = 5 n'existe pas dans Table1.
la source
Si vous avez inséré une ligne dans la table 1 avant de créer la clé étrangère dans la table 2, vous obtiendrez une erreur de contrainte de clé étrangère, car la valeur d'incrémentation automatique est 2 dans la table 1 et 1 dans la table 2. Pour résoudre ce problème, vous devez tronquer la table 1 et remettre la valeur d'incrémentation automatique à 1. Vous pouvez ensuite ajouter la table 2.
la source
Assurez-vous que vous avez défini le moteur de base de données sur InnoDB car dans MyISAM, la clé étrangère et la transaction ne sont pas prises en charge
la source
Juste un petit correctif: faites le JoinColumn 'nullable = true' dans Table1 et le champ 'UserID' 'insertable = false' et 'nullable = true' dans Table2.
Dans l'entité Table1:
Dans l'entité Table2:
la source
J'ai juste eu le même problème, la solution est simple.
Vous essayez d'ajouter un identifiant dans la table enfant qui n'existe pas dans la table parent.
vérifiez bien, car InnoDB a le bogue qui augmente parfois la colonne auto_increment sans ajouter de valeurs, par exemple,
INSERT ... ON DUPLICATE KEY
la source
J'ai eu un problème similaire. Vous essayez d'appliquer une clé étrangère sur une table qui a un contenu et la colonne ne peut pas être NULL. Vous avez deux options.
la source
Assurez-vous que la valeur que vous insérez dans la clé étrangère existe dans la table parent. Cela m'a aidé. Par exemple, si vous insérez
user_id = 2
danstable.2
, maistable.1
que vous n'avez pas deuser_id = 2
, la contrainte générera une erreur. Le mien était le code d'erreur # 1452 pour être exact. J'espère que cela aide quelqu'un d'autre avec le même problème!la source
J'ai eu le même problème, et la raison en était que j'avais une ligne dans la première table avant d'ajouter la clé étrangère.
la source
J'ai également rencontré le même problème et le problème était que la valeur des entrées de ma table parent ne correspondait pas à la valeur de la table de clé étrangère. Veuillez donc essayer après avoir effacé toutes les lignes.
la source
Au cas où les solutions fournies par d'autres ne fonctionnaient pas. Ensuite, vous devriez essayer de vérifier les moteurs de base de données des tables parent et enfant. Dans mon cas, j'ai réglé le moteur des tables parent sur "MyISAM", en le changeant en InnoDB le corrigeait.
J'espère que cela aidera les autres qui sont coincés comme moi.
la source
Vous ne devez pas placer un champ ondelete contre une cascade dans la base de données.
Définissez donc le champ onDelete sur RESTRICT
Bonne chance ♥
la source
Encore un autre cas étrange qui m'a donné cette erreur. J'avais référencé par erreur mes clés étrangères à la clé primaire id. Cela était dû à des commandes d'alter table incorrectes. J'ai découvert cela en interrogeant la table INFORMATION_SCHEMA (voir cette réponse stackoverflow)
La table était tellement confuse qu'elle ne pouvait être corrigée par aucune commande ALTER TABLE . J'ai finalement laissé tomber la table et l'ai reconstruite. Cela a éliminé intégritéError.
la source
Peut-être que pendant que vous avez ajouté la
userID
colonne, il y a une donnée pour cette certaine table qu'elle est établie afin qu'elle ait une valeur par défaut de0
, essayez d'ajouter la colonne sans leNOT NULL
la source
J'ai également eu cette erreur: "Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue". J'ai eu l'erreur lors de l'ajout d'une nouvelle ligne à la table parent
Le problème était que la contrainte de clé étrangère avait été définie sur la table parent au lieu de la table enfant.
la source
Si vous utilisez un index mysql ou une relation entre les tables, vous supprimez d'abord les colonnes (par exemple: city_id) et créez de nouvelles colonnes avec le même nom (par exemple: city_id) .Ensuite, réessayez ...
la source
La table contient-elle des données existantes? Si tel est le cas, essayez d'effacer toutes les données de la table pour lesquelles vous souhaitez ajouter une clé étrangère. Ensuite, exécutez à nouveau le code (ajoutez une clé étrangère).
J'ai rencontré ce problème tant de fois. Cette suppression de toutes les données de la table fonctionne lorsque vous souhaitez ajouter une clé étrangère sur une table existante.
J'espère que cela fonctionne :)
la source
Supprimez les index du champ UserID de table2. Il me convient
la source
Cette erreur se produit lorsque vous souhaitez ajouter une clé étrangère avec des valeurs qui n'existent pas dans la clé primaire de la table parent. Vous devez vous assurer que la nouvelle clé étrangère UserID dans table2 a des valeurs qui existent dans la clé primaire table1, parfois par défaut, elle est nulle ou égale à 0.
Vous pouvez d'abord mettre à jour tous les champs de la clé étrangère dans table2 avec une valeur qui existe dans la clé primaire de table1.
Si vous souhaitez ajouter différents ID utilisateur, vous devez modifier chaque ligne avec les valeurs souhaitées.
la source
Ce problème peut survenir pour les raisons suivantes:
Si vous le faites dans Spring mvc, vous devez décrire explicitement le type d'identifiant, car parfois mysql ne parvient pas à reconnaître le type d'identifiant. donc vous définissez explicitement comme dans les deux tables de votre classe d'entité
@GeneratedValue (strategy = GenerationType.IDENTITY)
la source