Exporta uma base de dados, tenta carregá-la numa instância nova e o MySQL devolve:
Ou, no PostgreSQL:
DETAIL: Key (user_id)=(42) is not present in table "users".
Porque é que isto acontece
Uma chave estrangeira diz “cada orders.user_id tem de apontar para um users.id existente.” Quando o dump insere orders antes de users, a linha pai referenciada ainda não existe e a base de dados rejeita a linha.
A maioria das ferramentas de dump escreve as tabelas por ordem alfabética ou por ordem de criação — não por ordem de dependência das chaves estrangeiras. Por isso orders (filha) fica frequentemente antes de users (pai) e a importação falha.
Solução 1: reordenar os INSERTs por dependência (a correção certa)
A solução limpa é inserir cada tabela pai antes das suas filhas. Isso significa resolver as chaves estrangeiras num grafo de dependências e carregar as tabelas por ordem topológica: users → orders → order_items.
Fazer isto à mão num ficheiro de vários gigabytes é penoso — tem de seguir cada FOREIGN KEY ao longo das instruções CREATE TABLE e ALTER TABLE e cortar/colar enormes blocos INSERT na sequência certa.
Solução 2: desativar a verificação de chaves estrangeiras durante a importação
Para um dump completo e já consistente, pode ignorar a validação com segurança durante o carregamento. No MySQL, envolva o ficheiro:
-- MySQL SET FOREIGN_KEY_CHECKS = 0; -- ... todas as suas instruções INSERT ... SET FOREIGN_KEY_CHECKS = 1;
No PostgreSQL, adie as restrições dentro de uma transação:
-- PostgreSQL BEGIN; SET CONSTRAINTS ALL DEFERRED; -- ... todas as suas instruções INSERT ... COMMIT;
Reative as verificações depois, para que as escritas futuras continuem validadas. Isto funciona, mas só disfarça o problema da ordem — se o dump for parcial, pode ainda acabar com linhas órfãs.
Solução 3: faça as duas automaticamente com o DumpCleaner
O DumpCleaner lê o dump, extrai cada chave estrangeira de CREATE TABLE e ALTER TABLE, constrói o grafo de dependências e exporta um ficheiro limpo que simplesmente importa:
- Arraste o seu dump
.sqlpara o DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite ou MS SQL). - Escolha Ordem dos INSERT → Por dependências (com reconhecimento de FK). Os pais são colocados antes das filhas automaticamente, por ordenação topológica.
- Opcionalmente, marque Desativar a verificação de chaves estrangeiras — o DumpCleaner envolve a saída com a instrução correta para a sua base de dados.
- Exporte. Importe o novo ficheiro — o erro de restrição desapareceu.
Deteta até chaves estrangeiras circulares e avisa-o, em vez de produzir uma ordem impossível.
Chega de cirurgia manual aos INSERT
O DumpCleaner reordena os inserts por dependência de chave estrangeira em ficheiros de qualquer tamanho — em streaming, com memória constante. Aplicação nativa para macOS e iPadOS, compra única.
Descarregar na App StorePerguntas frequentes
Porque é que acontece “a foreign key constraint fails” na importação?
Uma linha filha referencia uma linha pai que ainda não foi inserida, porque o dump ordena os INSERTs por ordem alfabética ou por data de criação em vez de por dependência de chave estrangeira.
É seguro desativar a verificação de chaves estrangeiras durante a importação?
Sim, para um dump completo e consistente. Está apenas a ignorar a validação de dados que já eram válidos na base de dados de origem. Reative as verificações depois.
Como reordeno os INSERTs sem editar o ficheiro à mão?
O DumpCleaner deteta as chaves estrangeiras, constrói um grafo de dependências e exporta os INSERTs por ordem topológica — para que os pais carreguem sempre antes das filhas.
Isto também funciona com o PostgreSQL?
Sim. O DumpCleaner suporta a saída do pg_dump e pode emitir SET CONSTRAINTS ALL DEFERRED bem como inserts ordenados por dependência.
Importe dumps sem a dor de cabeça das FK
Arraste, reordene por dependências, exporte. O DumpCleaner trata das chaves estrangeiras para que a sua importação simplesmente funcione.
Descarregar na App Store