Clave foránea
Una columna que guarda la clave primaria de otra tabla para relacionar las dos, como el cliente de cada pedido.
Las claves foráneas son lo que hace «relacional» a una base de datos: la tabla de pedidos no repite el nombre del cliente, solo guarda su id.
La base de datos puede impedir que guardes un pedido de un cliente que no existe o que borres un cliente que todavía tiene pedidos, manteniendo los datos coherentes.
Un ejemplo
pedidos.cliente_id apunta a clientes.id; con un JOIN obtienes cada pedido junto al nombre del cliente.
Por qué importa
La clave foránea es lo que convierte tablas sueltas en una base de datos relacional. Es una columna que guarda el valor de la clave primaria de otra tabla: en una tabla pedidos, la columna cliente_id apunta al id de la tabla clientes. Así no repites los datos del cliente en cada pedido, sino que los guardas una sola vez y los enlazas.
Además de relacionar, protege la integridad: el gestor no te permite insertar un pedido de un cliente que no existe ni borrar un cliente que aún tiene pedidos, salvo que lo hayas configurado así. Puedes elegir qué hacer en ese caso con reglas como ON DELETE CASCADE (borra también lo dependiente) o ON DELETE SET NULL. Entenderlo te evita datos huérfanos y te prepara para escribir consultas con JOIN.
Confusiones frecuentes
Se confunde con la clave primaria. La primaria identifica la fila de su propia tabla y no se repite; la foránea apunta a otra tabla y sí puede repetirse (muchos pedidos del mismo cliente). Otro error frecuente es pensar que sin declarar la restricción no hay relación: puedes tener una columna cliente_id sin clave foránea declarada, pero entonces el gestor no vigila nada y pueden aparecer referencias rotas. Y ON DELETE CASCADE conviene usarlo con cuidado: un borrado puede propagarse más de lo esperado.
Preguntas frecuentes
¿Por qué me da error al borrar una fila?
Probablemente otras filas la referencian mediante una clave foránea. Borra primero las dependientes, o define la regla ON DELETE adecuada al crear la restricción.
¿Puede una clave foránea valer nulo?
Sí, si la columna lo permite; significa que esa fila no está relacionada con ninguna otra. Si la relación debe ser obligatoria, declara la columna como NOT NULL.
Fuentes consultadas
- Foreign Keys (PostgreSQL Documentation)