"A foreign key constraint fails" oplossen bij het importeren van een SQL-dump

Je import stopt halverwege met Cannot add or update a child row: a foreign key constraint fails. De data is prima — de volgorde van de INSERT-statements klopt niet. Dit is waarom het gebeurt en drie manieren om het op te lossen.

Je exporteert een database, probeert die in een verse instantie te laden, en MySQL geeft de fout:

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

Of, op 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".

Waarom dit gebeurt

Een foreign key zegt: “elke orders.user_id moet verwijzen naar een bestaande users.id.” Wanneer de dump orders vóór users invoegt, bestaat de bovenliggende rij waarnaar wordt verwezen nog niet, en weigert de database de rij.

De meeste dump-tools schrijven tabellen alfabetisch of in aanmaakvolgorde — niet in volgorde van foreign key-afhankelijkheden. Zo belandt orders (child) vaak vóór users (parent), en breekt de import.

Oplossing 1: INSERTs herordenen op afhankelijkheid (de juiste oplossing)

De nette oplossing is om elke bovenliggende tabel vóór zijn onderliggende tabellen in te voegen. Dat betekent de foreign keys omzetten in een afhankelijkheidsgraaf en tabellen laden in topologische volgorde: users → orders → order_items.

Dit met de hand doen in een bestand van meerdere gigabytes is pijnlijk — je moet elke FOREIGN KEY volgen door CREATE TABLE- en ALTER TABLE-statements en enorme INSERT-blokken in de juiste volgorde knippen en plakken.

Oplossing 2: Foreign key-checks uitschakelen tijdens de import

Voor een volledige, al consistente dump kun je de validatie tijdens het laden veilig overslaan. Op MySQL omhul je het bestand zo:

-- MySQL
SET FOREIGN_KEY_CHECKS = 0;
-- ... al je INSERT-statements ...
SET FOREIGN_KEY_CHECKS = 1;

Op PostgreSQL stel je de constraints uit binnen een transactie:

-- PostgreSQL
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
-- ... al je INSERT-statements ...
COMMIT;

Schakel de checks daarna weer in zodat toekomstige writes gevalideerd blijven. Dit werkt, maar het maskeert alleen het volgordeprobleem — als de dump gedeeltelijk is, kun je nog steeds met verweesde rijen eindigen.

Oplossing 3: Beide automatisch met DumpCleaner

DumpCleaner leest de dump, haalt elke foreign key uit CREATE TABLE en ALTER TABLE, bouwt de afhankelijkheidsgraaf en exporteert een schoon bestand dat gewoon importeert:

  1. Sleep je .sql-dump in DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite of MS SQL).
  2. Kies INSERT-volgorde → Op afhankelijkheden (FK-bewust). Parents worden automatisch vóór children geplaatst via topologische sortering.
  3. Vink desgewenst Foreign key-checks uitschakelen aan — het omhult de uitvoer met het juiste statement voor jouw database.
  4. Exporteer. Importeer het nieuwe bestand — de constraint-fout is weg.

Het detecteert zelfs circulaire foreign keys en waarschuwt je in plaats van een onmogelijke volgorde te produceren.

Geen handmatig INSERT-geknutsel meer

DumpCleaner herordent inserts op foreign key-afhankelijkheid bij bestanden van elke grootte — streaming, met constant geheugengebruik. Native macOS- & iPadOS-app, eenmalige aankoop.

Downloaden in de App Store

Veelgestelde vragen

Waarom gebeurt “a foreign key constraint fails” bij de import?

Een onderliggende rij verwijst naar een bovenliggende rij die nog niet is ingevoegd, omdat de dump de INSERTs alfabetisch of op aanmaaktijd ordent in plaats van op foreign key-afhankelijkheid.

Is het veilig om foreign key-checks uit te schakelen tijdens de import?

Ja, voor een volledige en consistente dump. Je slaat alleen de validatie over van data die in de brondatabase al geldig was. Schakel de checks daarna weer in.

Hoe herorden ik INSERTs zonder het bestand met de hand te bewerken?

DumpCleaner detecteert foreign keys, bouwt een afhankelijkheidsgraaf en exporteert de INSERTs in topologische volgorde — zodat parents altijd vóór children laden.

Werkt dit ook voor PostgreSQL?

Ja. DumpCleaner ondersteunt pg_dump-uitvoer en kan zowel SET CONSTRAINTS ALL DEFERRED als op afhankelijkheid geordende inserts genereren.

Dumps importeren zonder FK-hoofdpijn

Slepen, herordenen op afhankelijkheden, exporteren. DumpCleaner regelt de foreign keys zodat je import gewoon werkt.

Downloaden in de App Store