Impossible d’append 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? Je lis http://www.w3schools.com/Sql/sql_foreignkey.asp et je ne vois pas ce qui ne va pas.

Vous obtenez cette erreur car vous essayez d’append / de mettre à jour une ligne dans table2 qui n’a pas de valeur valide pour le champ UserID fonction des valeurs actuellement stockées dans la table1 . Si vous publiez encore du code, je peux vous aider à diagnostiquer la cause spécifique.

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

Un simple hack peut être de désactiver les vérifications de clés étrangères avant d’effectuer toute opération sur la table. Simplement interroger

 SET FOREIGN_KEY_CHECKS=0 

Cela désactivera la correspondance de clé étrangère avec d’autres tables. Après avoir terminé avec la table, réactivez-la

 SET FOREIGN_KEY_CHECKS=1 

Cela fonctionne pour moi beaucoup de fois.

J’ai découvert un autre cas étrange: si vous créez accidentellement une clé étrangère depuis 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/

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 le tableau 1 et 1 dans la table 2. Pour résoudre ce problème tronquer le tableau 1 et redéfinir la valeur d’incrément automatique sur 1. Vous pouvez ensuite append le tableau 2.

Vous obtenez cette erreur car il existe une valeur int table2.UserID qui n’existe pas sur table1.UserID (je suppose que vous avez table2.UserID valeur table2.UserID manuellement avant de créer cette clé étrangère).
Un exemple pour cette scène: table1.UserID obtient les valeurs 1,2,3 et table2.UserID obtiennent les valeurs 4 (ajout par manuel). Donc, 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 table2 UserID = 4 de la table2 ou vous pouvez les vider tous les deux, puis créer la clé étrangère et.
Bonne chance!

J’ai juste eu le même problème, la solution est facile.

Vous essayez d’append un ID 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 append de valeurs, par exemple, INSERT ... ON DUPLICATE KEY

Assurez-vous d’avoir défini le moteur de firebase database comme InnoDB, car la clé étrangère et la transaction MyISAM ne sont pas sockets en charge.

J’ai eu un problème similaire. Vous essayez d’appliquer une clé étrangère sur une table qui a du contenu et la colonne n’est pas nullable. Vous avez deux options.

  1. Rendre la colonne que vous souhaitez appliquer des contraintes de clé étrangère sur Null. De cette façon, la clé étrangère s’appliquera en sachant que certains champs peuvent être nullables. ( C’est ce que j’ai fait )
  2. Créez la colonne sur laquelle vous souhaitez appliquer la 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. ( N’a pas essayé cela mais ça devrait marcher )

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 la table.2 , mais que table.1 n’a pas un user_id = 2 , la contrainte table.1 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!

Encore un cas étrange qui m’a donné cette erreur. J’avais fait référence à tort à mes clés étrangères à la clé primaire id. Cela était dû à des commandes alter alter incorrectes. Je l’ai découvert 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é l’intégritéError.

Peut-être pendant que vous avez ajouté la colonne userID , il y a une donnée pour cette table userID qu’il est établi de sorte qu’il aura une valeur par défaut de 0 , essayez d’append la colonne sans le NOT NULL

J’ai aussi eu cette erreur: “Impossible d’append 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 l’index mysql ou la relation entre les tables, supprimez d’abord les colonnes (par exemple: city_id) et créez de nouvelles colonnes avec le même nom (par exemple: city_id). Essayez ensuite à nouveau …

J’ai également rencontré le même problème et le problème était que la valeur de mes entrées de table parente ne correspondait pas à la valeur de la table de clé étrangère. Donc, s’il vous plaît essayez après effacer toutes les lignes ..

J’avais le même problème et la raison était que j’avais une ligne dans la première table avant d’append la clé étrangère.

la contrainte de clé étrangère de la table enfant échoue

Ce problème peut augmenter pour les raisons suivantes:

Si vous le faites dans Spring mvc, vous devez décrire explicitement le type d’ID, car parfois, mysql ne reconnaît pas le type d’ID. vous définissez donc explicitement comme dans les deux tables de votre classe d’entités @GeneratedValue (strategy = GenerationType.IDENTITY)