Corriger « a foreign key constraint fails » à l'import d'un dump SQL

Votre import s'arrête en cours de route avec Cannot add or update a child row: a foreign key constraint fails. Les données sont correctes — c'est l'ordre des instructions INSERT qui est mauvais. Voici pourquoi cela arrive et trois façons de le corriger.

Vous exportez une base de données, tentez de la charger dans une nouvelle instance, et MySQL renvoie :

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`app`.`orders`, CONSTRAINT `orders_user_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`))

Ou, sur PostgreSQL :

ERROR: insert or update on table "orders" violates foreign key constraint "orders_user_id_fkey"
DETAIL: Key (user_id)=(42) is not present in table "users".

Pourquoi cela arrive

Une clé étrangère impose que « chaque orders.user_id pointe vers un users.id existant ». Lorsque le dump insère orders avant users, la ligne parente référencée n'existe pas encore, et la base rejette la ligne.

La plupart des outils de dump écrivent les tables par ordre alphabétique ou par ordre de création — pas selon l'ordre des dépendances de clés étrangères. Ainsi, orders (enfant) se retrouve fréquemment avant users (parent), et l'import échoue.

Solution 1 : réordonner les INSERT par dépendance (la bonne solution)

La solution propre consiste à insérer chaque table parente avant ses enfants. Cela signifie résoudre les clés étrangères en un graphe de dépendances et charger les tables dans l'ordre topologique : users → orders → order_items.

Faire cela à la main dans un fichier de plusieurs gigaoctets est pénible — vous devez retracer chaque FOREIGN KEY à travers les instructions CREATE TABLE et ALTER TABLE et couper/coller d'énormes blocs INSERT dans le bon ordre.

Solution 2 : désactiver les vérifications de clés étrangères pendant l'import

Pour un dump complet et déjà cohérent, vous pouvez sauter la validation pendant le chargement sans risque. Sur MySQL, encadrez le fichier :

-- MySQL
SET FOREIGN_KEY_CHECKS = 0;
-- ... toutes vos instructions INSERT ...
SET FOREIGN_KEY_CHECKS = 1;

Sur PostgreSQL, différez les contraintes à l'intérieur d'une transaction :

-- PostgreSQL
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
-- ... toutes vos instructions INSERT ...
COMMIT;

Réactivez les vérifications ensuite pour que les futures écritures restent validées. Cela fonctionne, mais ne fait que masquer le problème d'ordre — si le dump est partiel, vous pouvez toujours vous retrouver avec des lignes orphelines.

Solution 3 : faire les deux automatiquement avec DumpCleaner

DumpCleaner lit le dump, extrait chaque clé étrangère des instructions CREATE TABLE et ALTER TABLE, construit le graphe de dépendances et exporte un fichier propre qui s'importe sans problème :

  1. Glissez votre dump .sql dans DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite ou MS SQL).
  2. Choisissez Ordre des INSERT → Par dépendances (compatible FK). Les parents sont placés avant les enfants automatiquement par tri topologique.
  3. Cochez éventuellement Désactiver les vérifications de clés étrangères — l'instruction adaptée à votre base est ajoutée autour de la sortie.
  4. Exportez. Importez le nouveau fichier — l'erreur de contrainte a disparu.

Il détecte même les clés étrangères circulaires et vous avertit au lieu de produire un ordre impossible.

Fini la chirurgie manuelle des INSERT

DumpCleaner réordonne les inserts par dépendance de clé étrangère sur des fichiers de toute taille — en flux continu, à mémoire constante. Application native macOS & iPadOS, achat unique.

Télécharger sur l'App Store

Questions fréquentes

Pourquoi l'erreur « a foreign key constraint fails » survient-elle à l'import ?

Une ligne enfant référence une ligne parente qui n'a pas encore été insérée, car le dump ordonne les INSERT par ordre alphabétique ou par date de création plutôt que par dépendance de clé étrangère.

Est-il sûr de désactiver les vérifications de clés étrangères pendant l'import ?

Oui, pour un dump complet et cohérent. Vous ne faites que sauter la validation de données déjà valides dans la base source. Réactivez les vérifications ensuite.

Comment réordonner les INSERT sans modifier le fichier à la main ?

DumpCleaner détecte les clés étrangères, construit un graphe de dépendances et exporte les INSERT dans l'ordre topologique — de sorte que les parents se chargent toujours avant les enfants.

Est-ce que cela fonctionne aussi pour PostgreSQL ?

Oui. DumpCleaner prend en charge la sortie de pg_dump et peut émettre SET CONSTRAINTS ALL DEFERRED ainsi que des inserts ordonnés par dépendance.

Importez vos dumps sans le casse-tête des FK

Glissez, réordonnez par dépendances, exportez. DumpCleaner gère les clés étrangères pour que votre import fonctionne du premier coup.

Télécharger sur l'App Store