Du exporterar en databas, försöker läsa in den i en ny instans, och MySQL kastar:
Eller, på PostgreSQL:
DETAIL: Key (user_id)=(42) is not present in table "users".
Varför detta händer
En foreign key säger att "varje orders.user_id måste peka på ett befintligt users.id." När dumpen infogar orders före users, finns den refererade föräldraraden ännu inte, och databasen avvisar raden.
De flesta dumpverktyg skriver tabeller alfabetiskt eller i skapelseordning — inte i ordning efter foreign key-beroenden. Så orders (barn) hamnar ofta före users (förälder), och importen går sönder.
Lösning 1: Ordna om INSERT-satserna efter beroenden (den korrekta lösningen)
Den rena lösningen är att infoga varje föräldratabell före dess barn. Det innebär att lösa upp foreign key-relationerna till en beroendegraf och läsa in tabellerna i topologisk ordning: users → orders → order_items.
Att göra detta för hand i en flergigabytesfil är plågsamt — du måste spåra varje FOREIGN KEY genom CREATE TABLE- och ALTER TABLE-satser och klippa/klistra enorma INSERT-block i rätt ordning.
Lösning 2: Inaktivera foreign key-kontroller under importen
För en fullständig, redan konsekvent dump kan du tryggt hoppa över valideringen under inläsningen. På MySQL, omslut filen:
-- MySQL SET FOREIGN_KEY_CHECKS = 0; -- ... alla dina INSERT-satser ... SET FOREIGN_KEY_CHECKS = 1;
På PostgreSQL, skjut upp villkoren inuti en transaktion:
-- PostgreSQL BEGIN; SET CONSTRAINTS ALL DEFERRED; -- ... alla dina INSERT-satser ... COMMIT;
Aktivera kontrollerna igen efteråt så att framtida skrivningar förblir validerade. Detta fungerar, men det maskerar bara ordningsproblemet — om dumpen är partiell kan du fortfarande sluta med föräldralösa rader.
Lösning 3: Gör båda automatiskt med DumpCleaner
DumpCleaner läser dumpen, extraherar varje foreign key från CREATE TABLE och ALTER TABLE, bygger beroendegrafen och exporterar en ren fil som bara importeras:
- Dra in din
.sql-dump i DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite eller MS SQL). - Välj INSERT-ordning → Efter beroenden (FK-medveten). Föräldrar placeras automatiskt före barn via topologisk sortering.
- Bocka eventuellt i Inaktivera foreign key-kontroller — det omsluter utdatan med rätt sats för din databas.
- Exportera. Importera den nya filen — villkorsfelet är borta.
Den upptäcker till och med cirkulära foreign keys och varnar dig i stället för att producera en omöjlig ordning.
Ingen mer manuell INSERT-kirurgi
DumpCleaner ordnar om inserts efter foreign key-beroenden på filer av valfri storlek — strömmande, med konstant minne. Inhemsk macOS- och iPadOS-app, engångsköp.
Ladda ner i App StoreVanliga frågor
Varför uppstår "a foreign key constraint fails" vid import?
En barnrad refererar till en föräldrarad som ännu inte har infogats, eftersom dumpen ordnar INSERT-satserna alfabetiskt eller efter skapelsetid i stället för efter foreign key-beroenden.
Är det säkert att inaktivera foreign key-kontroller under importen?
Ja, för en fullständig och konsekvent dump. Du hoppar bara över validering av data som redan var giltig i källdatabasen. Aktivera kontrollerna igen efteråt.
Hur ordnar jag om INSERT-satserna utan att redigera filen för hand?
DumpCleaner upptäcker foreign keys, bygger en beroendegraf och exporterar INSERT-satserna i topologisk ordning — så att föräldrar alltid läses in före barn.
Fungerar detta även för PostgreSQL?
Ja. DumpCleaner stöder pg_dump-utdata och kan skriva ut SET CONSTRAINTS ALL DEFERRED samt beroendeordnade inserts.
Importera dumpar utan FK-huvudvärken
Dra, ordna om efter beroenden, exportera. DumpCleaner hanterar foreign keys så att din import bara fungerar.
Ladda ner i App Store