Exportujete databázu, pokúsite sa ju načítať do čistej inštancie a MySQL vyhodí:
Alebo v PostgreSQL:
DETAIL: Key (user_id)=(42) is not present in table "users".
Prečo sa to deje
Cudzí kľúč hovorí „každý orders.user_id musí odkazovať na existujúci users.id.“ Keď dump vloží orders pred users, odkazovaný nadradený riadok ešte neexistuje a databáza riadok odmietne.
Väčšina dump nástrojov zapisuje tabuľky abecedne alebo v poradí vytvorenia — nie v poradí závislostí cudzích kľúčov. Takže orders (podradená) často skončí pred users (nadradenou) a import zlyhá.
Oprava 1: Preusporiadajte INSERTy podľa závislostí (správna oprava)
Čistým riešením je vložiť každú nadradenú tabuľku pred jej podradené tabuľky. To znamená rozpoznať cudzie kľúče do grafu závislostí a načítať tabuľky v topologickom poradí: users → orders → order_items.
Robiť to ručne vo viacgigabajtovom súbore je bolestivé — musíte vystopovať každý FOREIGN KEY naprieč príkazmi CREATE TABLE a ALTER TABLE a vystrihávať/vkladať obrovské bloky INSERT v správnom poradí.
Oprava 2: Vypnite kontrolu cudzích kľúčov počas importu
Pri úplnom a už konzistentnom dumpe môžete počas načítavania bezpečne preskočiť validáciu. V MySQL obaľte súbor:
-- MySQL SET FOREIGN_KEY_CHECKS = 0; -- ... všetky vaše príkazy INSERT ... SET FOREIGN_KEY_CHECKS = 1;
V PostgreSQL odložte obmedzenia v rámci transakcie:
-- PostgreSQL BEGIN; SET CONSTRAINTS ALL DEFERRED; -- ... všetky vaše príkazy INSERT ... COMMIT;
Potom kontroly znova zapnite, aby budúce zápisy zostali validované. Toto funguje, ale iba zamaskuje problém s poradím — ak je dump čiastočný, stále môžete skončiť s osirelými riadkami.
Oprava 3: Urobte oboje automaticky s DumpCleaner
DumpCleaner načíta dump, extrahuje každý cudzí kľúč z CREATE TABLE a ALTER TABLE, zostaví graf závislostí a exportuje čistý súbor, ktorý sa jednoducho naimportuje:
- Pretiahnite svoj
.sqldump do DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite alebo MS SQL). - Zvoľte Poradie INSERTov → Podľa závislostí (s ohľadom na FK). Nadradené tabuľky sa automaticky umiestnia pred podradené pomocou topologického triedenia.
- Voliteľne zaškrtnite Vypnúť kontrolu cudzích kľúčov — obalí výstup správnym príkazom pre vašu databázu.
- Exportujte. Naimportujte nový súbor — chyba obmedzenia je preč.
Dokonca deteguje cyklické cudzie kľúče a upozorní vás namiesto vytvorenia nemožného poradia.
Koniec ručnej chirurgie s INSERTmi
DumpCleaner preusporiada inserty podľa závislostí cudzích kľúčov v súboroch akejkoľvek veľkosti — prúdovo, s konštantnou pamäťou. Natívna aplikácia pre macOS a iPadOS, jednorazová kúpa.
Stiahnuť v App StoreČasto kladené otázky
Prečo sa pri importe objaví „a foreign key constraint fails“?
Podradený riadok odkazuje na nadradený riadok, ktorý ešte nebol vložený, pretože dump usporadúva INSERTy abecedne alebo podľa času vytvorenia namiesto podľa závislosti cudzích kľúčov.
Je bezpečné vypnúť kontrolu cudzích kľúčov počas importu?
Áno, pri úplnom a konzistentnom dumpe. Preskakujete iba validáciu dát, ktoré už boli v zdrojovej databáze platné. Potom kontroly znova zapnite.
Ako preusporiadam INSERTy bez ručnej úpravy súboru?
DumpCleaner deteguje cudzie kľúče, zostaví graf závislostí a exportuje INSERTy v topologickom poradí — takže nadradené tabuľky sa vždy načítajú pred podradenými.
Funguje to aj pre PostgreSQL?
Áno. DumpCleaner podporuje výstup pg_dump a dokáže vydať SET CONSTRAINTS ALL DEFERRED, ako aj inserty usporiadané podľa závislostí.
Importujte dumpy bez trápenia s FK
Pretiahnite, preusporiadajte podľa závislostí, exportujte. DumpCleaner sa postará o cudzie kľúče, takže váš import jednoducho funguje.
Stiahnuť v App Store