Corrigir "a foreign key constraint fails" ao importar um dump SQL

A sua importação para a meio com Cannot add or update a child row: a foreign key constraint fails. Os dados estão corretos — a ordem das instruções INSERT é que está errada. Veja porque acontece e três formas de o resolver.

Exporta uma base de dados, tenta carregá-la numa instância nova e o MySQL devolve:

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

Ou, no 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".

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:

  1. Arraste o seu dump .sql para o DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite ou MS SQL).
  2. 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.
  3. 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.
  4. 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 Store

Perguntas 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