Esporti un database, provi a caricarlo in una nuova istanza e MySQL restituisce:
Oppure, su PostgreSQL:
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:
- Trascina il tuo dump
.sqlin DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite o MS SQL). - Scegli Ordine delle INSERT → Per dipendenze (basato sulle FK). Le tabelle padre vengono collocate prima delle figlie automaticamente tramite ordinamento topologico.
- Facoltativamente spunta Disabilita i controlli delle chiavi esterne — racchiude l'output con l'istruzione corretta per il tuo database.
- 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 StoreDomande 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