Si ya tienes clara la clave primaria, la clave foránea es el paso natural que sigue, y es donde de verdad empieza a notarse por qué Bases de Datos es la asignatura que más gente suspende en mi clase: no es difícil de definir, pero hay que entender bien qué protege y qué pasa cuando intentas romperla, porque ahí es donde aparecen la mayoría de errores en los ejercicios.

Qué es una clave foránea

Una clave foránea (foreign key) es una columna en una tabla que apunta a la clave primaria de otra tabla (o, a veces, de la misma tabla). Su función es crear una relación entre dos tablas y garantizar que esa relación siempre apunta a algo que existe de verdad.

CREATE TABLE alumnos (
  id INT PRIMARY KEY,
  nombre VARCHAR(100)
);

CREATE TABLE matriculas (
  id INT PRIMARY KEY,
  alumno_id INT,
  asignatura VARCHAR(50),
  FOREIGN KEY (alumno_id) REFERENCES alumnos(id)
);

Aquí, matriculas.alumno_id es una clave foránea que apunta a alumnos.id. Cada fila de matriculas “pertenece” a un alumno concreto, y la base de datos no te va a dejar meter una matrícula que apunte a un alumno_id que no existe en la tabla alumnos.

INSERT INTO matriculas (id, alumno_id, asignatura) VALUES (1, 99, 'Bases de Datos');
-- Error: no existe ningún alumno con id = 99

Eso es exactamente lo que se conoce como integridad referencial: la garantía de que una clave foránea nunca apunta a algo que no está.

Por qué existe esta restricción

Sin clave foránea, alumno_id sería una columna INT normal y corriente, sin ninguna vigilancia. Podrías insertar matrículas con alumno_id = 99 aunque ese alumno no exista, con alumno_id = -5, o dejarlo apuntando a un alumno que borraste hace tiempo. La base de datos no se enteraría de nada, y acabarías con datos “huérfanos”: registros que hacen referencia a algo que ya no está, y que solo descubres cuando la aplicación falla al intentar mostrar el nombre de un alumno que no existe.

La clave foránea traslada esa responsabilidad de “vigilar que todo cuadre” del programador (o de ti mismo escribiendo INSERTs a mano) al propio motor de base de datos, que lo comprueba en cada operación sin que tengas que acordarte.

Qué pasa cuando borras el registro al que apunta una clave foránea

Aquí está el matiz que más confunde en los ejercicios de clase: ¿qué ocurre si intentas borrar un alumno que tiene matrículas asociadas? Por defecto, la mayoría de motores lo impiden, con un error. Pero puedes decidir explícitamente qué comportamiento quieres con ON DELETE:

CREATE TABLE matriculas (
  id INT PRIMARY KEY,
  alumno_id INT,
  asignatura VARCHAR(50),
  FOREIGN KEY (alumno_id) REFERENCES alumnos(id) ON DELETE CASCADE
);
OpciónQué hace al borrar el alumno
RESTRICT (por defecto en muchos motores)Impide el borrado mientras existan matrículas asociadas
CASCADEBorra automáticamente también todas sus matrículas
SET NULLDeja alumno_id a NULL en las matrículas (la columna debe permitir NULL)
NO ACTIONSimilar a RESTRICT en la práctica en la mayoría de motores

No hay una opción “correcta” universal — depende de la lógica de negocio. Borrar un alumno y que arrastre sus matrículas (CASCADE) tiene sentido en muchos casos, pero borrar un producto y que arrastre en cascada todos los pedidos históricos que lo incluían probablemente no es lo que quieres.

Una clave foránea no tiene por qué ser única

Este es otro punto donde se mezclan conceptos: una clave foránea no tiene que cumplir unicidad, al contrario que la clave primaria a la que apunta. Es perfectamente normal, y de hecho lo habitual, que el mismo valor se repita muchas veces en la columna que actúa como clave foránea — un mismo alumno puede tener diez matrículas, así que alumno_id = 3 puede aparecer diez veces en la tabla matriculas. Lo único que exige la restricción es que cada uno de esos valores exista en la tabla referenciada.

Una tabla puede tener varias claves foráneas

No hay límite de una sola clave foránea por tabla. Una tabla intermedia que relaciona dos entidades (lo típico en relaciones muchos-a-muchos) suele tener dos claves foráneas, una apuntando a cada lado de la relación:

CREATE TABLE matriculas (
  id INT PRIMARY KEY,
  alumno_id INT,
  asignatura_id INT,
  FOREIGN KEY (alumno_id) REFERENCES alumnos(id),
  FOREIGN KEY (asignatura_id) REFERENCES asignaturas(id)
);

Aquí matriculas conecta alumnos con asignaturas: cada fila representa “este alumno cursa esta asignatura”, y ambas columnas están vigiladas por su propia restricción de integridad referencial de forma independiente. Puedes tener una tabla con tres, cuatro o más claves foráneas sin ningún problema, siempre que cada una apunte a una clave primaria válida en su tabla correspondiente.

Clave primaria vs clave foránea, de un vistazo

Clave primariaClave foránea
Identifica de forma única su propia tablaNo
Puede repetirse el valorNo
Puede quedar vacía (NULL)NoSí, si la columna lo permite
Apunta a otra tablaNoSí, a una clave primaria (normalmente)

Pon a prueba lo que has entendido

Tienes `pedidos.cliente_id` como clave foránea que apunta a `clientes.id`. ¿Puede el mismo `cliente_id` aparecer en varias filas distintas de la tabla `pedidos`?

Resumen rápido

Una clave foránea es una columna que apunta a la clave primaria de otra tabla, y su función es garantizar la integridad referencial: que esa relación nunca quede apuntando a algo que no existe. A diferencia de la clave primaria, sí puede repetirse y sí puede quedar vacía. La opción ON DELETE (RESTRICT, CASCADE, SET NULL) decide qué pasa con los datos relacionados cuando borras el registro al que apuntan. Si todavía no tienes claro el concepto del que parte todo esto, empieza por qué es una clave primaria en bases de datos.