web-dev-qa-db-fra.com

Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue

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.

145
Tom

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.

195
Brian Driscoll

Cela signifie que vous essayez d'insérer dans table2 une valeur UserID qui n'existe pas dans table1.

112
Rami C

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.

81
Sandeep Giri

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.

Voir http://nick.zoic.org/art/mysql-foreign-key-error/

35
NickZoic

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!

13
Justin

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.

10
Attaque

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

6
Blaztix

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.

  1. Définissez la colonne sur laquelle vous souhaitez appliquer les contraintes de clé étrangère pour pouvoir être annulée. De cette façon, la clé étrangère s'appliquera sachant que certains champs peuvent être nullables. ( C'est ce que j'ai fait. )
  2. Créez la colonne sur laquelle vous souhaitez appliquer une contrainte de clé étrangère, écrivez une requête pour insérer la clé étrangère dans la colonne, puis appliquez les contraintes de clé étrangère. ( Je n'ai pas essayé mais ça devrait marcher )
5
Jacob

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.

4
Aman Maurya

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!

2
Dustin Hammack

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.

2
Ouissal

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.

1
Sbudah

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;
1
Ujjwal Chaudhary

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.

0
Vicky T

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 :)

0
Noldy

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

0
WTFZane

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 .

0
Justin Jose

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.

0
Nadir Latif

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 ...

0
Mahmut Aydın