El síntoma: INSERT, UPDATE o DELETE rompe una relación entre tablas
Una FOREIGN KEY protege la integridad referencial: el valor de la tabla hija debe apuntar a una clave válida de la tabla padre, salvo los casos permitidos por la definición de la restricción. PostgreSQL muestra explícitamente este tipo de error cuando una inserción o actualización intenta referenciar una clave inexistente.
El mismo principio también puede bloquear un borrado del padre si todavía existen filas hijas y la acción ON DELETE no permite resolver esas referencias automáticamente.
Ejemplo reproducible: el cliente 99 no existe
CREATE TABLE clientes (
id INTEGER PRIMARY KEY,
nombre TEXT NOT NULL
);
CREATE TABLE pedidos (
id INTEGER PRIMARY KEY,
cliente_id INTEGER NOT NULL,
FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);
INSERT INTO clientes (id, nombre)
VALUES (1, 'Ana');
INSERT INTO pedidos (id, cliente_id)
VALUES (101, 99);El pedido intenta guardar cliente_id = 99, pero la tabla clientes no contiene esa clave. La corrección no consiste en quitar la restricción: primero debes decidir si falta el cliente, si el identificador es incorrecto o si la relación debería ser opcional.
Corrige el dato o el orden de la operación
INSERT INTO clientes (id, nombre)
VALUES (99, 'Luis');
INSERT INTO pedidos (id, cliente_id)
VALUES (101, 99);| pedido_id | cliente_id | cliente |
|---|---|---|
| 101 | 99 | Luis |
Si falla DELETE, busca primero las filas hijas
Antes de borrar una fila padre, comprueba qué tablas la referencian. Con la acción predeterminada habitual, la base de datos no permitirá dejar filas hijas apuntando a una clave que ya no existe. Acciones como CASCADE, SET NULL o SET DEFAULT cambian el comportamiento y deben elegirse por el significado del modelo, no para evitar un error puntual.
No desactives las claves foráneas como primera solución. Puedes transformar un error visible en datos incoherentes más difíciles de reparar.
Comprueba cómo está habilitada la integridad en tu motor
PostgreSQL aplica las restricciones de clave foránea definidas en el esquema. SQLite también ofrece soporte de claves foráneas, pero su documentación indica que la aplicación debe habilitar su cumplimiento por conexión en configuraciones donde no esté activado por defecto. Si pruebas ejemplos en SQLite, confirma esa configuración antes de interpretar que una inserción inválida “funciona”.
Método de diagnóstico
- Identifica la restricción y las columnas que conecta.
- Lee el valor concreto que intenta insertarse, actualizarse o eliminarse.
- Busca la fila padre con un
SELECTpequeño. - Si el problema aparece al borrar, busca filas hijas antes de decidir una acción
ON DELETE. - Corrige el dato o el modelo; no ocultes la comprobación de integridad.
Error frecuente: confundir el orden de carga con un problema de sintaxis
La sentencia puede estar perfectamente escrita
El error es semántico: la fila hija referencia una clave que todavía no existe. En cargas de datos, crea primero las entidades padre o utiliza una estrategia transaccional compatible con las restricciones definidas.
Práctica correctiva
Diagnostica qué falta antes de insertar el pedido
Un pedido llega con cliente_id = 7 y la FOREIGN KEY falla. Escribe la comprobación mínima que harías antes de cambiar el INSERT.
Solución razonada
SELECT id, nombre
FROM clientes
WHERE id = 7;Si no devuelve filas, ya sabes por qué la referencia no puede validarse. Decide después si debes crear el cliente, corregir el identificador o revisar el modelo.
Qué debes recordar
- Una FOREIGN KEY protege una relación, no la sintaxis de la sentencia.
- Comprueba el valor hijo y la existencia de la fila padre.
- Antes de borrar un padre, localiza las filas que lo referencian.
- No desactives integridad referencial para hacer desaparecer el error.
- Elige CASCADE, SET NULL u otras acciones por semántica del dominio.