Du eksporterer en database, forsøger at indlæse den i en frisk instans, og MySQL kaster:
Eller på PostgreSQL:
DETAIL: Key (user_id)=(42) is not present in table "users".
Hvorfor det sker
En foreign key siger “hver orders.user_id skal pege på et eksisterende users.id.” Når dumpen indsætter orders før users, findes den refererede forældrerække endnu ikke, og databasen afviser rækken.
De fleste dump-værktøjer skriver tabeller alfabetisk eller i oprettelsesrækkefølge — ikke i foreign key-afhængighedsrækkefølge. Så orders (barn) lander ofte før users (forælder), og importen bryder sammen.
Løsning 1: Omordn INSERTs efter afhængighed (den rigtige løsning)
Den rene løsning er at indsætte hver forældretabel før dens børn. Det betyder at løse foreign keys op i en afhængighedsgraf og indlæse tabeller i topologisk rækkefølge: users → orders → order_items.
At gøre det i hånden i en fil på flere gigabyte er smertefuldt — du skal spore hver FOREIGN KEY på tværs af CREATE TABLE- og ALTER TABLE-sætninger og klippe/indsætte kæmpe INSERT-blokke i den rigtige rækkefølge.
Løsning 2: Deaktivér foreign key-tjek under import
For en komplet, allerede konsistent dump kan du roligt springe validering over under indlæsning. På MySQL pakker du filen ind:
-- MySQL SET FOREIGN_KEY_CHECKS = 0; -- ... alle dine INSERT-sætninger ... SET FOREIGN_KEY_CHECKS = 1;
På PostgreSQL udskyder du constraints inde i en transaktion:
-- PostgreSQL BEGIN; SET CONSTRAINTS ALL DEFERRED; -- ... alle dine INSERT-sætninger ... COMMIT;
Genaktivér tjekkene bagefter, så fremtidige skrivninger forbliver valideret. Det virker, men det maskerer kun rækkefølgeproblemet — hvis dumpen er delvis, kan du stadig ende med forældreløse rækker.
Løsning 3: Gør begge dele automatisk med DumpCleaner
DumpCleaner læser dumpen, udtrækker hver foreign key fra CREATE TABLE og ALTER TABLE, bygger afhængighedsgrafen og eksporterer en ren fil, der bare importerer:
- Træk din
.sql-dump ind i DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite eller MS SQL). - Vælg INSERT-rækkefølge → Efter afhængigheder (FK-bevidst). Forældre placeres automatisk før børn via topologisk sortering.
- Sæt eventuelt flueben ved Deaktivér foreign key-tjek — det pakker outputtet ind med den korrekte sætning til din database.
- Eksportér. Importér den nye fil — constraint-fejlen er væk.
Den registrerer endda cirkulære foreign keys og advarer dig i stedet for at producere en umulig rækkefølge.
Slut med manuel INSERT-kirurgi
DumpCleaner omordner inserts efter foreign key-afhængighed på filer af enhver størrelse — streamende, med konstant hukommelse. Native macOS- & iPadOS-app, engangskøb.
Hent i App StoreOfte stillede spørgsmål
Hvorfor opstår “a foreign key constraint fails” ved import?
En barnerække refererer til en forældrerække, der endnu ikke er indsat, fordi dumpen ordner INSERTs alfabetisk eller efter oprettelsestidspunkt i stedet for efter foreign key-afhængighed.
Er det sikkert at deaktivere foreign key-tjek under import?
Ja, for en fuld og konsistent dump. Du springer kun validering over af data, der allerede var gyldige i kildedatabasen. Genaktivér tjekkene bagefter.
Hvordan omordner jeg INSERTs uden at redigere filen i hånden?
DumpCleaner registrerer foreign keys, bygger en afhængighedsgraf og eksporterer INSERTs i topologisk rækkefølge — så forældre altid indlæses før børn.
Virker dette også for PostgreSQL?
Ja. DumpCleaner understøtter pg_dump-output og kan udsende SET CONSTRAINTS ALL DEFERRED samt afhængighedsordnede inserts.
Importér dumps uden FK-hovedpinen
Træk, omordn efter afhængigheder, eksportér. DumpCleaner håndterer foreign keys, så din import bare virker.
Hent i App Store