Exportas una base de datos, intentas cargarla en una instancia nueva y MySQL lanza:
O, en PostgreSQL:
DETAIL: Key (user_id)=(42) is not present in table "users".
Por qué ocurre esto
Una clave foránea dice «cada orders.user_id debe apuntar a un users.id existente». Cuando el volcado inserta orders antes que users, la fila padre referenciada aún no existe y la base de datos rechaza la fila.
La mayoría de las herramientas de volcado escriben las tablas alfabéticamente o en orden de creación, no en orden de dependencia de claves foráneas. Así que orders (hijo) suele aparecer antes que users (padre) y la importación se rompe.
Solución 1: reordenar los INSERT por dependencia (la solución correcta)
La solución limpia consiste en insertar cada tabla padre antes que sus hijas. Eso significa resolver las claves foráneas en un grafo de dependencias y cargar las tablas en orden topológico: users → orders → order_items.
Hacer esto a mano en un archivo de varios gigabytes es una tortura: tienes que rastrear cada FOREIGN KEY a través de las sentencias CREATE TABLE y ALTER TABLE y cortar y pegar enormes bloques INSERT en la secuencia correcta.
Solución 2: desactivar las comprobaciones de claves foráneas durante la importación
Para un volcado completo y ya consistente puedes omitir la validación de forma segura durante la carga. En MySQL, envuelve el archivo:
-- MySQL SET FOREIGN_KEY_CHECKS = 0; -- ... todas tus sentencias INSERT ... SET FOREIGN_KEY_CHECKS = 1;
En PostgreSQL, aplaza las restricciones dentro de una transacción:
-- PostgreSQL BEGIN; SET CONSTRAINTS ALL DEFERRED; -- ... todas tus sentencias INSERT ... COMMIT;
Vuelve a activar las comprobaciones después para que las escrituras futuras sigan validándose. Esto funciona, pero solo enmascara el problema de orden: si el volcado es parcial, todavía puedes acabar con filas huérfanas.
Solución 3: hacer ambas cosas automáticamente con DumpCleaner
DumpCleaner lee el volcado, extrae cada clave foránea de CREATE TABLE y ALTER TABLE, construye el grafo de dependencias y exporta un archivo limpio que simplemente se importa:
- Arrastra tu volcado
.sqla DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite o MS SQL). - Elige Orden de INSERT → Por dependencias (según claves foráneas). Los padres se colocan antes que los hijos automáticamente mediante ordenación topológica.
- Opcionalmente marca Desactivar comprobaciones de claves foráneas: envuelve la salida con la sentencia correcta para tu base de datos.
- Exporta. Importa el nuevo archivo: el error de restricción ha desaparecido.
Incluso detecta claves foráneas circulares y te avisa en lugar de producir un orden imposible.
Se acabó la cirugía manual de INSERT
DumpCleaner reordena los inserts por dependencia de claves foráneas en archivos de cualquier tamaño: en streaming y con memoria constante. App nativa para macOS e iPadOS, pago único.
Descargar en la App StorePreguntas frecuentes
¿Por qué ocurre «a foreign key constraint fails» al importar?
Una fila hija referencia a una fila padre que aún no se ha insertado, porque el volcado ordena los INSERT alfabéticamente o por orden de creación en lugar de por dependencia de claves foráneas.
¿Es seguro desactivar las comprobaciones de claves foráneas durante la importación?
Sí, para un volcado completo y consistente. Solo estás omitiendo la validación de datos que ya eran válidos en la base de datos de origen. Vuelve a activar las comprobaciones después.
¿Cómo reordeno los INSERT sin editar el archivo a mano?
DumpCleaner detecta las claves foráneas, construye un grafo de dependencias y exporta los INSERT en orden topológico, de modo que los padres siempre se cargan antes que los hijos.
¿Funciona esto también para PostgreSQL?
Sí. DumpCleaner admite la salida de pg_dump y puede emitir SET CONSTRAINTS ALL DEFERRED además de inserts ordenados por dependencia.
Importa volcados sin el dolor de cabeza de las claves foráneas
Arrastra, reordena por dependencias, exporta. DumpCleaner se encarga de las claves foráneas para que tu importación simplemente funcione.
Descargar en la App Store