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 KEYque otros referencian. Ejemplo: Clientes conID_Cliente. -
Tabla hija (secundaria):
contiene la
FOREIGN KEYque apunta al padre. Ejemplo: Pedidos conID_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;
Resultado:
«Cliente VIP» enlazado con Ana García. El
JOIN
une la FK con la PK del padre.
| Nota | Nombre_Cliente |
|---|---|
| Cliente VIP | Ana 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;
| Comentario | Nombre_Producto |
|---|---|
| Muy bueno | Café 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;
Resultado: envío 1 → pedido 1 → Ana García; envío 2 → pedido 3 → Elena Torres.
| ID_Envio | Nombre_Cliente |
|---|---|
| 1 | Ana García |
| 2 | Elena 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) |
JOIN … ON |
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 |
|---|---|---|---|
| 1 | Ana García | Madrid | España |
| 2 | Luis Pérez | Barcelona | España |
| 3 | María López | Valencia | España |
| 4 | Carlos Ruiz | Madrid | España |
| 6 | John Smith | London | UK |
| … 5 clientes más en la demo (10 en total) | |||
Base de datos de demostración: Productos
| ID_Producto | Nombre_Producto | Precio | Stock |
|---|---|---|---|
| 1 | Café expreso | 12.50 | 120 |
| 2 | Té verde | 8.00 | 200 |
| 3 | Salsa de tomate | 3.20 | 340 |
| 4 | Galletas de avena | 4.50 | 180 |
| 5 | Queso manchego | 15.00 | 90 |
| 6 | Arroz integral | 2.80 | 500 |
| 7 | Jamón serrano | 22.00 | 60 |
| 8 | Manzanas Golden | 1.90 | 400 |
| 9 | Salmón fresco | 18.50 | 45 |
| 10 | Aceite de oliva | 9.90 | 150 |
Tabla Pedidos (demo)
| ID_Pedido | ID_Cliente | ID_Empleado | Fecha |
|---|---|---|---|
| 1 | 1 | 1 | 2024-01-15 |
| 2 | 3 | 2 | 2024-01-18 |
| 3 | 5 | 1 | 2024-02-02 |
| 4 | 2 | 3 | 2024-02-10 |
| 5 | 6 | 4 | 2024-02-14 |
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
JOINpara 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.