¿Qué es una Clave Primaria y una Clave Foránea en SQL?
Aprende qué son las claves primarias y foráneas, cómo definirlas con restricciones de integridad, qué tipos de identificadores usar (SERIAL vs UUID) y cómo funcionan las políticas de borrado en cascada (ON DELETE CASCADE).
Una Clave Primaria (Primary Key o PK) es una columna o conjunto de columnas cuyos valores identifican de forma unívoca y no nula cada fila dentro de una tabla; una Clave Foránea (Foreign Key o FK) es una columna que establece un vínculo referencial formal entre los datos de esa tabla y la clave primaria de otra tabla.
Constituyen el fundamento de la integridad referencial en el modelo relacional: impiden la existencia de registros huérfanos (como un pedido asociado a un cliente inexistente) y garantizan que las relaciones entre datos sean siempre coherentes y confiables a nivel de motor.
Imagina tu documento nacional de identidad (DNI o cédula) y un pasaje de avión: tu DNI es tu Clave Primaria (no existen dos personas con el mismo DNI y nadie puede carecer de uno). El billete de avión tiene una casilla que dice 'DNI del pasajero': esa casilla es una Clave Foránea que apunta a tu DNI oficial en el registro civil. Si alguien intenta comprar un billete con un DNI falso o inventado, el sistema del aeropuerto rechaza la operación de inmediato.
Explicación Paso a Paso del Tema
Definir una Clave Primaria sólida (SERIAL vs UUID)
Elige la estrategia de identificación adecuada para tus entidades.
Históricamente se usaban enteros autoincrementales (`SERIAL` o `BIGINT GENERATED ALWAYS AS IDENTITY`). Son rápidos y ocupan poco espacio (4 u 8 bytes), pero son predecibles (cualquiera puede adivinar que el usuario 5 existe probando `api/usuarios/5`). Los identificadores universales únicos (UUID v4 o v7) son cadenas criptográficamente aleatorias de 128 bits generadas sin colisión en cualquier máquina, ideales para sistemas distribuidos y seguridad.
CREATE TABLE cuentas ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), titular VARCHAR(100) );
| Parámetro / Flag | Tipo / Rol | Significado y Uso |
|---|---|---|
| UUID PRIMARY KEY | Tipo de identificador | Establece un identificador de 128 bits no predecible como clave única |
| gen_random_uuid() | Función criptográfica | Genera automáticamente un UUID versión 4 aleatorio al insertar la fila |
Usa claves sustitutas (surrogate keys) como IDs numéricos o UUIDs que carezcan de significado de negocio para garantizar estabilidad perpetua.
Usar datos del mundo real que pueden cambiar (como el número de teléfono o el correo) como clave primaria; si el usuario cambia de correo, actualizarás cientos de relaciones.
Vincular tablas mediante Claves Foráneas
Aplica restricciones que impidan guardar referencias inexistentes.
La cláusula `REFERENCES tabla_padre(columna_pk)` obliga al motor a validar en cada inserción que el ID exista. Si intentas insertar un pedido con `cliente_id = 9999` y ese cliente no existe en la tabla de clientes, la base de datos abortará la transacción con un error de violación de clave foránea.
ALTER TABLE facturas ADD CONSTRAINT fk_facturas_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id);
| Parámetro / Flag | Tipo / Rol | Significado y Uso |
|---|---|---|
| FOREIGN KEY | Restricción referencial | Declara formalmente que la columna local depende de una tabla externa |
| REFERENCES clientes(id) | Destino referencial | Indica exactamente qué tabla y qué columna primaria validan la existencia |
Crea siempre un índice en las columnas que sean Claves Foráneas (`CREATE INDEX idx_pedidos_cliente ON pedidos(cliente_id)`); esto acelerará drásticamente los JOINs.
Crear columnas de relación sin declarar la restricción formal de Foreign Key en la base de datos, confiando solo en la validación del código frontend o backend.
Configurar acciones de borrado (ON DELETE)
Define qué debe pasar con los registros dependientes cuando se borra un padre.
Tienes tres opciones principales: 1. `ON DELETE RESTRICT` (o NO ACTION, por defecto): Impide borrar el cliente si tiene facturas asociadas. 2. `ON DELETE CASCADE`: Si borras el cliente, el motor borra automáticamente todas sus facturas (usar con extrema cautela). 3. `ON DELETE SET NULL`: Borra el cliente y deja el campo `cliente_id` en NULL en las facturas.
FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE RESTRICT
| Parámetro / Flag | Tipo / Rol | Significado y Uso |
|---|---|---|
| ON DELETE RESTRICT | Política de protección | Bloquea la eliminación del registro padre mientras existan registros hijos dependientes |
En sistemas empresariales, adopta el patrón de borrado lógico (Soft Delete) añadiendo una columna `deleted_at TIMESTAMP NULL` en lugar de borrar filas físicamente.
Usar `ON DELETE CASCADE` en tablas críticas de contabilidad, borrando facturas legales por haber eliminado un cliente inactivo.
Casos Prácticos Reales en Producción
Situaciones de ingeniería reales sin mención de presupuestos ficticios.
1Caso de Producción: Erradicación de Registros Huérfanos en Sistema Escolar
Un sistema escolar que utilizaba tablas sin claves foráneas tenía más de 14,000 calificaciones registradas de alumnos que habían sido dados de baja años atrás, lo que causaba inconsistencias y caídas continuas al generar actas oficiales de notas.
Se limpiaron los registros huérfanos y se aplicaron restricciones estrictas de Claves Foráneas con `ON DELETE RESTRICT` entre las tablas de matrículas, alumnos, cursos y calificaciones.
Fichas Nemotécnicas de Conceptos Clave
Glosario rápido para recordar los términos fundamentales de la lección.
Identificador único obligatorio de una fila en una tabla; indexado automáticamente por el motor para búsquedas instantáneas.
Columna que apunta a la clave primaria de otra tabla garantizando que el valor exista previamente en la tabla padre.
Regla de integridad que elimina automáticamente los registros hijos si el registro padre correspondiente es borrado.
¿Qué es una Clave Primaria y una Clave Foránea en SQL?
Selecciona una opción para autoevaluarte al instante. La respuesta se califica de inmediato.
¿Cuáles son las dos condiciones obligatorias que debe cumplir cualquier columna declarada como Clave Primaria?
¿Cuál es la función principal de una Clave Foránea (Foreign Key)?
¿Qué ocurre si una relación tiene la regla 'ON DELETE RESTRICT' e intentas borrar el registro padre con hijos existentes?
Preguntas Frecuentes (FAQ)
¿Puede una tabla tener más de una Clave Primaria?
No. Una tabla solo puede tener una única Clave Primaria. Sin embargo, esa clave puede estar compuesta por dos o más columnas juntas (Clave Primaria Compuesta), por ejemplo (estudiante_id, curso_id).
¿Puede una Clave Foránea tener valores nulos (NULL)?
Sí, a menos que le agregues explícitamente la restricción `NOT NULL`. Un valor NULL en una clave foránea simplemente indica que ese registro no está vinculado a ningún padre por el momento.
¿Por qué los UUID v7 son preferibles sobre los UUID v4 en bases de datos?
Porque los UUID v7 incluyen una marca temporal (timestamp) ordenada al inicio, lo que evita la fragmentación de índices B-Tree en disco, manteniendo la velocidad de inserción tan alta como la de los enteros autoincrementales.