Error SQL · integridad referencial

FOREIGN KEY falla: comprueba qué fila padre falta o sigue referenciada

Una clave foránea falla cuando la modificación dejaría una referencia que no cumple la relación definida. Comprueba primero qué valor referencia a qué clave antes de cambiar la restricción.

Lectura: 15–19 minEjemplo reproduciblePráctica con pistas

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

Esquema y operación problemática
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

Inserción válida
INSERT INTO clientes (id, nombre)
VALUES (99, 'Luis');

INSERT INTO pedidos (id, cliente_id)
VALUES (101, 99);
Relación válida después de crear primero la fila padre
pedido_idcliente_idcliente
10199Luis

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

  1. Identifica la restricción y las columnas que conecta.
  2. Lee el valor concreto que intenta insertarse, actualizarse o eliminarse.
  3. Busca la fila padre con un SELECT pequeño.
  4. Si el problema aparece al borrar, busca filas hijas antes de decidir una acción ON DELETE.
  5. 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

Intermedia · relaciones

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.

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.

Conceptos relacionados

Fuentes técnicas consultadas