Riješite „a foreign key constraint fails” pri uvozu SQL dumpa

Vaš se uvoz zaustavlja na pola s Cannot add or update a child row: a foreign key constraint fails. Podaci su ispravni — pogrešan je redoslijed INSERT naredbi. Evo zašto se to događa i tri načina da to riješite.

Izvezete bazu podataka, pokušate je učitati u novu instancu, a MySQL izbaci:

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

Ili, na PostgreSQL-u:

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".

Zašto se to događa

Vanjski ključ kaže „svaki orders.user_id mora upućivati na postojeći users.id.” Kada dump unosi orders prije users, referencirani nadređeni redak još ne postoji i baza podataka odbacuje redak.

Većina alata za dump zapisuje tablice abecedno ili redoslijedom stvaranja — ne prema ovisnostima vanjskih ključeva. Tako orders (podređeni) često dođe prije users (nadređeni), i uvoz se prekida.

Rješenje 1: Presložite INSERT-ove prema ovisnostima (ispravno rješenje)

Čisto rješenje je unijeti svaku nadređenu tablicu prije njezinih podređenih. To znači razriješiti vanjske ključeve u graf ovisnosti i učitavati tablice topološkim redoslijedom: users → orders → order_items.

Raditi to ručno u datoteci od više gigabajta je mučno — morate pratiti svaki FOREIGN KEY kroz CREATE TABLE i ALTER TABLE naredbe te izrezivati/lijepiti goleme INSERT blokove u pravom slijedu.

Rješenje 2: Onemogućite provjeru vanjskih ključeva tijekom uvoza

Za potpun, već konzistentan dump možete sigurno preskočiti provjeru tijekom učitavanja. Na MySQL-u, omotajte datoteku:

-- MySQL
SET FOREIGN_KEY_CHECKS = 0;
-- ... sve vaše INSERT naredbe ...
SET FOREIGN_KEY_CHECKS = 1;

Na PostgreSQL-u, odgodite ograničenja unutar transakcije:

-- PostgreSQL
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
-- ... sve vaše INSERT naredbe ...
COMMIT;

Nakon toga ponovno uključite provjere kako bi budući upisi ostali validirani. Ovo radi, ali samo prikriva problem redoslijeda — ako je dump djelomičan, još uvijek možete završiti s osirotjelim recima.

Rješenje 3: Učinite oboje automatski s DumpCleanerom

DumpCleaner čita dump, izvlači svaki vanjski ključ iz CREATE TABLE i ALTER TABLE, gradi graf ovisnosti i izvozi čistu datoteku koja se jednostavno uvozi:

  1. Povucite svoj .sql dump u DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite ili MS SQL).
  2. Odaberite Redoslijed INSERT-a → Prema ovisnostima (svjesno vanjskih ključeva). Nadređene tablice automatski se postavljaju prije podređenih putem topološkog sortiranja.
  3. Po želji označite Onemogući provjeru vanjskih ključeva — to omota izlaz ispravnom naredbom za vašu bazu podataka.
  4. Izvezite. Uvezite novu datoteku — greška ograničenja je nestala.

Čak otkriva i kružne vanjske ključeve te vas upozorava umjesto da proizvede nemoguć redoslijed.

Nema više ručne operacije nad INSERT-ima

DumpCleaner preslaguje INSERT-ove prema ovisnostima vanjskih ključeva na datotekama bilo koje veličine — protočno, uz konstantnu memoriju. Nativna macOS i iPadOS aplikacija, jednokratna kupnja.

Preuzmi na App Storeu

Često postavljana pitanja

Zašto se „a foreign key constraint fails” događa pri uvozu?

Podređeni redak referencira nadređeni redak koji još nije unesen, jer dump slaže INSERT-ove abecedno ili prema vremenu stvaranja umjesto prema ovisnostima vanjskih ključeva.

Je li sigurno onemogućiti provjeru vanjskih ključeva tijekom uvoza?

Da, za potpun i konzistentan dump. Samo preskačete provjeru podataka koji su već bili ispravni u izvornoj bazi podataka. Nakon toga ponovno uključite provjere.

Kako da presložim INSERT-ove bez ručnog uređivanja datoteke?

DumpCleaner otkriva vanjske ključeve, gradi graf ovisnosti i izvozi INSERT-ove topološkim redoslijedom — pa se nadređene tablice uvijek učitavaju prije podređenih.

Radi li ovo i za PostgreSQL?

Da. DumpCleaner podržava izlaz iz pg_dump-a i može emitirati SET CONSTRAINTS ALL DEFERRED kao i INSERT-ove poredane prema ovisnostima.

Uvozite dumpove bez glavobolje s vanjskim ključevima

Povucite, presložite prema ovisnostima, izvezite. DumpCleaner rješava vanjske ključeve pa vaš uvoz jednostavno radi.

Preuzmi na App Storeu