Risolvere “a foreign key constraint fails” durante l'import di un dump SQL

L'import si blocca a metà con Cannot add or update a child row: a foreign key constraint fails. I dati sono a posto — è l'ordine delle istruzioni INSERT a essere sbagliato. Ecco perché succede e tre modi per risolverlo.

Esporti un database, provi a caricarlo in una nuova istanza e MySQL restituisce:

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

Oppure, su PostgreSQL:

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

Perché succede

Una chiave esterna dice “ogni orders.user_id deve puntare a un users.id esistente”. Quando il dump inserisce orders prima di users, la riga padre di riferimento non esiste ancora e il database rifiuta la riga.

La maggior parte degli strumenti di dump scrive le tabelle in ordine alfabetico o in ordine di creazione — non nell'ordine delle dipendenze delle chiavi esterne. Così orders (figlia) finisce spesso prima di users (padre) e l'import si interrompe.

Soluzione 1: riordinare le INSERT per dipendenza (la soluzione corretta)

La soluzione pulita è inserire ogni tabella padre prima delle sue figlie. Significa risolvere le chiavi esterne in un grafo delle dipendenze e caricare le tabelle in ordine topologico: users → orders → order_items.

Farlo a mano in un file di più gigabyte è un incubo — devi seguire ogni FOREIGN KEY tra le istruzioni CREATE TABLE e ALTER TABLE e tagliare/incollare enormi blocchi INSERT nella sequenza giusta.

Soluzione 2: disabilitare i controlli delle chiavi esterne durante l'import

Per un dump completo e già coerente puoi saltare senza rischi la validazione durante il caricamento. Su MySQL, racchiudi il file:

-- MySQL
SET FOREIGN_KEY_CHECKS = 0;
-- ... tutte le tue istruzioni INSERT ...
SET FOREIGN_KEY_CHECKS = 1;

Su PostgreSQL, rimanda i vincoli all'interno di una transazione:

-- PostgreSQL
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
-- ... tutte le tue istruzioni INSERT ...
COMMIT;

Riabilita i controlli in seguito, così le scritture future restano validate. Funziona, ma nasconde solo il problema dell'ordine — se il dump è parziale, puoi comunque ritrovarti con righe orfane.

Soluzione 3: fai entrambe le cose automaticamente con DumpCleaner

DumpCleaner legge il dump, estrae ogni chiave esterna da CREATE TABLE e ALTER TABLE, costruisce il grafo delle dipendenze ed esporta un file pulito che si importa senza problemi:

  1. Trascina il tuo dump .sql in DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite o MS SQL).
  2. Scegli Ordine delle INSERT → Per dipendenze (basato sulle FK). Le tabelle padre vengono collocate prima delle figlie automaticamente tramite ordinamento topologico.
  3. Facoltativamente spunta Disabilita i controlli delle chiavi esterne — racchiude l'output con l'istruzione corretta per il tuo database.
  4. Esporta. Importa il nuovo file — l'errore di vincolo è sparito.

Rileva persino le chiavi esterne circolari e ti avvisa invece di produrre un ordine impossibile.

Basta interventi manuali sulle INSERT

DumpCleaner riordina le insert per dipendenza di chiave esterna su file di qualsiasi dimensione — in streaming, con memoria costante. App nativa per macOS e iPadOS, acquisto una tantum.

Scarica dall'App Store

Domande frequenti

Perché succede “a foreign key constraint fails” durante l'import?

Una riga figlia fa riferimento a una riga padre non ancora inserita, perché il dump ordina le INSERT alfabeticamente o per data di creazione anziché per dipendenza delle chiavi esterne.

È sicuro disabilitare i controlli delle chiavi esterne durante l'import?

Sì, per un dump completo e coerente. Stai solo saltando la validazione di dati che erano già validi nel database di origine. Riabilita i controlli in seguito.

Come riordino le INSERT senza modificare il file a mano?

DumpCleaner rileva le chiavi esterne, costruisce un grafo delle dipendenze ed esporta le INSERT in ordine topologico — così le tabelle padre vengono sempre caricate prima delle figlie.

Funziona anche per PostgreSQL?

Sì. DumpCleaner supporta l'output di pg_dump e può emettere SET CONSTRAINTS ALL DEFERRED oltre alle insert ordinate per dipendenza.

Importa i dump senza il mal di testa delle FK

Trascina, riordina per dipendenze, esporta. DumpCleaner gestisce le chiavi esterne, così il tuo import funziona e basta.

Scarica dall'App Store