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.
Vous obtenez cette erreur parce que vous essayez d'ajouter/mettre à jour une ligne dans table2
qui n'a pas de valeur valide pour le champ UserID
en fonction des valeurs actuellement stockées dans table1
. Si vous publiez plus de code, je peux vous aider à diagnostiquer la cause spécifique.
Cela signifie que vous essayez d'insérer dans table2
une valeur UserID
qui n'existe pas dans table1
.
Un simple hack peut consister à désactiver les vérifications de clé étrangère avant d’effectuer toute opération sur la table. Il suffit d'interroger
SET FOREIGN_KEY_CHECKS=0
Cela désactivera la correspondance de clé étrangère avec toutes les autres tables. Une fois que vous avez terminé avec la table, réactivez-la
SET FOREIGN_KEY_CHECKS=1
Cela fonctionne souvent pour moi.
J'ai découvert un autre cas étrange: si vous créez accidentellement une clé étrangère d'une table InnoDB à une table MyISAM, MySQL lève cette erreur au moment de l'insertion même si les données sont par ailleurs valides.
Vous obtenez cette erreur car il existe une valeur int table2.UserID
qui n'existe pas sur table1.UserID
(je suppose que vous avez défini la valeur table2.UserID
manuellement avant de créer cette clé étrangère) .
Un exemple pour cette scène: table1.UserID
récupère les valeurs 1, 2, 3 et table2.UserID
récupère les valeurs 4 (addition manuelle). Ainsi, lorsque vous créez une clé étrangère, ils ne peuvent pas trouver UserID = 4
à partir de table1
et l'erreur se produira .
Pour corriger cette erreur, supprimez simplement UserID = 4
de table2
ou vous pouvez vider les deux, puis créer la clé étrangère et .
Bonne chance!
Si vous avez inséré une ligne dans le tableau 1 avant de créer la clé étrangère dans le tableau 2, vous obtiendrez une erreur de contrainte de clé étrangère, car la valeur d'incrémentation automatique est 2 dans le tableau 1 et 1 dans le tableau 2. Pour résoudre ce problème, vous devez tronquez le tableau 1 et réglez la valeur d’incrément automatique sur 1. Vous pouvez ensuite ajouter le tableau 2.
Je viens d'avoir le même problème, la solution est facile.
Vous essayez d'ajouter un identifiant dans la table enfant qui n'existe pas 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
J'ai eu un problème similaire. Vous essayez d'appliquer une clé étrangère sur une table contenant du contenu et la colonne n'est pas nullable. Vous avez deux options.
Assurez-vous que le moteur de base de données est défini sur InnoDB car, dans MyISAM, la clé étrangère et la transaction ne sont pas prises en charge.
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
dans table.2
, mais que table.1
ne possède pas de user_id = 2
, la contrainte génère 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!
J'avais le même problème et la raison en était que j'avais une ligne dans le premier tableau avant d'ajouter la clé étrangère.
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 parente.
par exemple. Le tableau 2 contient les données suivantes:
UserID PostID Title Summary
5 1 Lorem Ipsum dolor sit
Tableau 1
UserID Password Username Email
9 ******** JohnDoe [email protected]
Si vous essayez ALTER table2 et ajoutez une clé étrangère, la requête échouera car l'ID utilisateur = 5 n'existe pas dans Table1.
Juste un petit correctif: Définissez JoinColumn 'nullable = true' dans Table1 et le champ 'ID utilisateur' 'insérable = false' et 'nullable = true' dans Table2.
Dans Table1 Entity:
@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;
Dans Table2 Entity:
@Column(insertable = false, nullable = true)
private int UserID;
Encore un autre cas étrange qui m'a donné cette erreur. J'avais par erreur référencé mes clés étrangères à la clé primaire id. Cela était dû à des commandes incorrectes dans la table alter. J'ai découvert ceci en interrogeant la table INFORMATION_SCHEMA (voir cette réponse stackoverflow)
La table était tellement confuse qu'elle ne pouvait pas être corrigée par aucune commande ALTER TABLE. J'ai finalement laissé tomber la table et l'ai reconstruite. Cela s'est débarrassé de l'intégritéError.
La table contient-elle des données existantes? Si c'est le cas, essayez d'effacer toutes les données de la table auxquelles vous souhaitez ajouter une clé étrangère. Ensuite, exécutez le code (ajoutez une clé étrangère) à nouveau.
J'ai rencontré ce problème tellement 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 ça marche :)
Pendant que vous avez ajouté la colonne userID
, il est possible que des données soient établies pour cette table. Elle a donc la valeur par défaut 0
. Essayez d’ajouter la colonne sans le NOT NULL
.
J'ai également rencontré le même problème et le problème était que la valeur des entrées de ma table parente ne correspondait pas à celle de la table de clé étrangère .
J'ai aussi eu l'erreur suivante: "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 parente
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.
Si vous utilisez mysql index ou une relation entre les tables, commencez par supprimer les colonnes (par exemple: city_id) et créez-en de nouvelles avec le même nom (par exemple: city_id) .Essayez ensuite de nouveau ...