Exportálsz egy adatbázist, megpróbálod betölteni egy új példányba, és a MySQL ezt dobja:
Vagy PostgreSQL esetén:
DETAIL: Key (user_id)=(42) is not present in table "users".
Miért történik ez
Az idegenkulcs azt mondja: „minden orders.user_id értéknek egy létező users.id értékre kell mutatnia.” Ha a dump az orders táblát előbb szúrja be, mint a users táblát, a hivatkozott szülősor még nem létezik, és az adatbázis elutasítja a sort.
A legtöbb dump-eszköz a táblákat ábécésorrendben vagy létrehozási sorrendben írja ki – nem az idegenkulcs-függőségek sorrendjében. Így az orders (gyerek) gyakran a users (szülő) elé kerül, és az importálás elhasal.
1. megoldás: az INSERT-ek átrendezése függőség szerint (a helyes megoldás)
A tiszta megoldás az, hogy minden szülőtáblát a gyerekei elé szúrunk be. Ehhez az idegenkulcsokat egy függőségi gráffá kell feloldani, és a táblákat topologikus sorrendben betölteni: users → orders → order_items.
Ezt kézzel elvégezni egy több gigabájtos fájlban kínszenvedés – végig kell követned minden FOREIGN KEY hivatkozást a CREATE TABLE és ALTER TABLE utasításokon át, majd hatalmas INSERT blokkokat kivágni és beilleszteni a megfelelő sorrendben.
2. megoldás: az idegenkulcs-ellenőrzések kikapcsolása importáláskor
Egy teljes, már konzisztens dump esetén nyugodtan kihagyhatod a validálást a betöltés idejére. MySQL esetén foglald keretbe a fájlt:
-- MySQL SET FOREIGN_KEY_CHECKS = 0; -- ... az összes INSERT utasításod ... SET FOREIGN_KEY_CHECKS = 1;
PostgreSQL esetén halaszd el a megszorításokat egy tranzakción belül:
-- PostgreSQL BEGIN; SET CONSTRAINTS ALL DEFERRED; -- ... az összes INSERT utasításod ... COMMIT;
Utána kapcsold vissza az ellenőrzéseket, hogy a jövőbeni írások validáltak maradjanak. Ez működik, de csak elfedi a sorrendi problémát – ha a dump részleges, még mindig árva sorokkal maradhatsz.
3. megoldás: mindkettő automatikusan a DumpCleanerrel
A DumpCleaner beolvassa a dumpot, kinyer minden idegenkulcsot a CREATE TABLE és ALTER TABLE utasításokból, felépíti a függőségi gráfot, és exportál egy tiszta fájlt, amely simán importálódik:
- Húzd a
.sqldumpodat a DumpCleanerbe (MySQL, MariaDB, PostgreSQL, SQLite vagy MS SQL). - Válaszd az INSERT sorrend → Függőségek szerint (idegenkulcs-tudatos) lehetőséget. A szülők automatikusan a gyerekek elé kerülnek topologikus rendezéssel.
- Opcionálisan pipáld be az Idegenkulcs-ellenőrzések kikapcsolása opciót – ez az adatbázisodnak megfelelő utasítással foglalja keretbe a kimenetet.
- Exportálj. Importáld az új fájlt – a megszorítási hiba eltűnt.
Még a körkörös idegenkulcsokat is felismeri, és figyelmeztet ahelyett, hogy lehetetlen sorrendet állítana elő.
Nincs több kézi INSERT-sebészet
A DumpCleaner idegenkulcs-függőség szerint rendezi át az insert utasításokat bármekkora fájlon – streamelve, állandó memóriahasználattal. Natív macOS & iPadOS alkalmazás, egyszeri vásárlás.
Letöltés az App Store-bólGyakran ismételt kérdések
Miért fordul elő az „a foreign key constraint fails” hiba importáláskor?
Egy gyereksor egy olyan szülősorra hivatkozik, amelyet még nem szúrtak be, mert a dump az INSERT utasításokat ábécésorrendben vagy létrehozási idő szerint rendezi, nem pedig az idegenkulcs-függőség szerint.
Biztonságos az idegenkulcs-ellenőrzések kikapcsolása importáláskor?
Igen, egy teljes és konzisztens dump esetén. Csak olyan adatok validálását hagyod ki, amelyek a forrás-adatbázisban már érvényesek voltak. Utána kapcsold vissza az ellenőrzéseket.
Hogyan rendezhetem át az INSERT-eket a fájl kézi szerkesztése nélkül?
A DumpCleaner felismeri az idegenkulcsokat, felépíti a függőségi gráfot, és topologikus sorrendben exportálja az INSERT-eket – így a szülők mindig a gyerekek előtt töltődnek be.
PostgreSQL esetén is működik ez?
Igen. A DumpCleaner támogatja a pg_dump kimenetet, és képes SET CONSTRAINTS ALL DEFERRED utasítást, valamint függőség szerint rendezett insert utasításokat kibocsátani.
Importálj dumpokat idegenkulcs-fejfájás nélkül
Húzd be, rendezd át függőségek szerint, exportáld. A DumpCleaner elintézi az idegenkulcsokat, hogy az importálásod egyszerűen működjön.
Letöltés az App Store-ból