FOREIGN KEY en SQL

Una FOREIGN KEY (clave foránea) en SQL conecta dos tablas : la columna de la tabla hija solo puede contener valores que ya existan en la PRIMARY KEY de la tabla padre.

Es la forma en que la base de datos garantiza integridad referencial : no puedes tener un pedido de un cliente que no existe, ni una línea de detalle de un producto inventado.


Tabla padre y tabla hija en SQL

En una relación con clave foránea siempre hay dos papeles:

  • Tabla padre (principal): tiene la PRIMARY KEY que otros referencian. Ejemplo: Clientes con ID_Cliente .
  • Tabla hija (secundaria): contiene la FOREIGN KEY que apunta al padre. Ejemplo: Pedidos con ID_Cliente .

Un mismo cliente (padre) puede tener varios pedidos (hijos). Eso es una relación uno a muchos (1:N) , la más habitual en SQL.


¿Qué problema resuelve FOREIGN KEY?

Sin clave foránea podrías insertar en Pedidos un ID_Cliente = 999 que no existe en Clientes . Ese registro quedaría huérfano : un pedido sin cliente real asociado.

La FOREIGN KEY hace que el motor rechace ese INSERT y mantenga los datos coherentes. Cuando consultas con JOIN , cada ID_Cliente del pedido encuentra su nombre en Clientes .


Sintaxis FOREIGN KEY en CREATE TABLE

Plantilla

    CREATE TABLE tabla_hija (
    id TIPO PRIMARY KEY,
    id_padre TIPO NOT NULL,
    FOREIGN KEY (id_padre) REFERENCES tabla_padre(id_padre)
);
  

Lectura en voz alta: «La columna id_padre de tabla_hija debe ser un valor que exista en id_padre de tabla_padre» .


FOREIGN KEY hacia Clientes

Creamos Notas_Cliente : cada nota pertenece a un cliente existente. Solo ID_Cliente = 1 es válido si Ana García está en la tabla Clientes :

FK hacia Clientes

    CREATE TABLE Notas_Cliente (
    ID_Nota INTEGER PRIMARY KEY,
    ID_Cliente INTEGER NOT NULL,
    Nota TEXT,
    FOREIGN KEY (ID_Cliente) REFERENCES Clientes(ID_Cliente)
);
INSERT INTO Notas_Cliente (ID_Nota, ID_Cliente, Nota)
VALUES (1, 1, 'Cliente VIP');
SELECT n.Nota, c.Nombre_Cliente
FROM Notas_Cliente n
JOIN Clientes c ON n.ID_Cliente = c.ID_Cliente;
  
Abrir en editor

Resultado: «Cliente VIP» enlazado con Ana García. El JOIN une la FK con la PK del padre.

NotaNombre_Cliente
Cliente VIPAna García

FOREIGN KEY hacia Productos

Mismo patrón con Productos : la reseña solo puede referenciar un ID_Producto que exista en el catálogo.

FK hacia Productos

    CREATE TABLE Resenas (
    ID INTEGER PRIMARY KEY,
    ID_Producto INTEGER NOT NULL,
    Comentario TEXT,
    FOREIGN KEY (ID_Producto) REFERENCES Productos(ID_Producto)
);
INSERT INTO Resenas (ID, ID_Producto, Comentario)
VALUES (1, 1, 'Muy bueno');
SELECT r.Comentario, p.Nombre_Producto
FROM Resenas r
JOIN Productos p ON r.ID_Producto = p.ID_Producto;
  
Abrir en editor
ComentarioNombre_Producto
Muy buenoCafé expreso

FOREIGN KEY hacia Pedidos

En bases reales las FKs se encadenan: Envios apunta a Pedidos , y Pedidos apunta a Clientes . Así sabes qué cliente recibe cada envío:

FK hacia Pedidos con JOIN

    CREATE TABLE Envios (
    ID_Envio INTEGER PRIMARY KEY,
    ID_Pedido INTEGER NOT NULL,
    Fecha_Envio TEXT,
    FOREIGN KEY (ID_Pedido) REFERENCES Pedidos(ID_Pedido)
);
INSERT INTO Envios (ID_Envio, ID_Pedido, Fecha_Envio)
VALUES (1, 1, '2024-01-16'), (2, 3, '2024-02-03');
SELECT e.ID_Envio, c.Nombre_Cliente
FROM Envios e
JOIN Pedidos p ON e.ID_Pedido = p.ID_Pedido
JOIN Clientes c ON p.ID_Cliente = c.ID_Cliente
ORDER BY e.ID_Envio;
  
Abrir en editor

Resultado: envío 1 → pedido 1 → Ana García; envío 2 → pedido 3 → Elena Torres.

ID_EnvioNombre_Cliente
1Ana García
2Elena Torres

FOREIGN KEY y JOIN en SQL

La clave foránea define la regla en la base de datos (solo valores válidos). El JOIN recupera los datos relacionados en una consulta:

Concepto Qué hace Cuándo se usa
FOREIGN KEY Valida al insertar o actualizar Al crear la tabla (CREATE TABLE)
JOINON Combina columnas de dos tablas en un SELECT Al consultar datos relacionados

En la demo, Pedidos.ID_Cliente actúa como FK hacia Clientes.ID_Cliente . Por eso INNER JOIN Clientes ON Pedidos.ID_Cliente = Clientes.ID_Cliente funciona de forma predecible.


Tablas demo para FOREIGN KEY

ID_Cliente Nombre_Cliente Ciudad Pais
1Ana GarcíaMadridEspaña
2Luis PérezBarcelonaEspaña
3María LópezValenciaEspaña
4Carlos RuizMadridEspaña
6John SmithLondonUK
… 5 clientes más en la demo (10 en total)
Tabla Clientes (extracto). Diez clientes; cinco tienen pedidos.

Base de datos de demostración: Productos

ID_Producto Nombre_Producto Precio Stock
1Café expreso12.50120
2Té verde8.00200
3Salsa de tomate3.20340
4Galletas de avena4.50180
5Queso manchego15.0090
6Arroz integral2.80500
7Jamón serrano22.0060
8Manzanas Golden1.90400
9Salmón fresco18.5045
10Aceite de oliva9.90150
Tabla Productos en el editor SQL.

Tabla Pedidos (demo)

ID_Pedido ID_Cliente ID_Empleado Fecha
1112024-01-15
2322024-01-18
3512024-02-02
4232024-02-10
5642024-02-14
Tabla Pedidos en el editor SQL. Cinco pedidos enlazan clientes y empleados.

Resumen FOREIGN KEY

  • FOREIGN KEY (col) REFERENCES tabla(pk) enlaza hija con padre.
  • Solo admite valores que existan en la PRIMARY KEY referenciada.
  • Evita filas huérfanas y mantiene la integridad referencial.
  • Se combina con JOIN para mostrar datos de varias tablas.
  • Siguiente paso: UNIQUE y otras restricciones de columna.

Comprueba lo aprendido

Responde 2–3 preguntas sobre esta lección. Verás ✓ en verde si aciertas o ✗ en rojo si fallas.