Contenido de esta guía
Qué es una clave primaria compuesta
Una clave primaria compuesta identifica una fila usando la combinación de dos o más columnas. Ninguna de esas columnas tiene por qué identificar la fila por sí sola: es la combinación completa la que debe ser única.
Es habitual en tablas que representan una relación, por ejemplo una línea de pedido identificada por pedido_id y producto_id.
Sintaxis: la restricción se declara a nivel de tabla
CREATE TABLE lineas_pedido (
pedido_id INTEGER NOT NULL,
producto_id INTEGER NOT NULL,
cantidad INTEGER NOT NULL CHECK (cantidad > 0),
PRIMARY KEY (pedido_id, producto_id)
);La restricción dice que una misma pareja pedido–producto no puede repetirse. Otro pedido sí puede contener el mismo producto, y el mismo pedido puede contener productos diferentes.
Ejemplo: qué combinaciones son válidas
INSERT INTO lineas_pedido VALUES (10, 2, 1);
INSERT INTO lineas_pedido VALUES (10, 5, 2);
INSERT INTO lineas_pedido VALUES (11, 2, 1);| pedido_id | producto_id |
|---|---|
| 10 | 2 |
| 10 | 5 |
| 11 | 2 |
Intentar insertar otra fila con (10, 2) viola la clave primaria porque esa combinación ya existe.
Cuándo usarla y cuándo preferir un id independiente
Una clave compuesta es una buena candidata cuando la combinación forma parte natural de la identidad del dato y es estable. Un identificador artificial separado puede ser más práctico cuando otras tablas tendrán que referenciar la fila con frecuencia o cuando las columnas de la combinación pueden cambiar.
No añadas una clave compuesta solo para “evitar duplicados” si la fila ya tiene otra identidad principal: en ese caso una restricción UNIQUE (columna_a, columna_b) puede expresar mejor la regla.
Matiz importante en SQLite
El estándar SQL y motores como PostgreSQL tratan las columnas de una PRIMARY KEY como no nulas. SQLite conserva una excepción histórica en tablas rowid ordinarias: determinadas claves primarias no INTEGER PRIMARY KEY pueden aceptar NULL salvo que declares NOT NULL, uses una tabla WITHOUT ROWID o una tabla STRICT. Por portabilidad y claridad, declara explícitamente NOT NULL en las columnas de una clave compuesta cuando trabajes con SQLite.
Error frecuente
Declarar dos PRIMARY KEY separadas
Una tabla tiene una sola restricción de clave primaria. Si la identidad necesita dos columnas, escríbelas juntas en PRIMARY KEY (a, b); no marques ambas columnas como claves primarias independientes.
Comprueba lo aprendido
Modela asistencia por alumno y fecha
Crea una tabla asistencia en la que cada alumno pueda tener como máximo un registro por fecha. Incluye alumno_id, fecha y presente.
PRIMARY KEY (alumno_id, fecha).Solución razonada
CREATE TABLE asistencia (
alumno_id INTEGER NOT NULL,
fecha DATE NOT NULL,
presente INTEGER NOT NULL DEFAULT 1,
PRIMARY KEY (alumno_id, fecha)
);La clave impide dos registros del mismo alumno en la misma fecha, pero permite el mismo alumno en fechas distintas y varios alumnos en una misma fecha.
Qué debes recordar
- Una clave primaria puede abarcar varias columnas.
- La combinación completa es la que identifica la fila.
- Una tabla solo tiene una PRIMARY KEY, aunque esa clave tenga varias columnas.
- Si solo quieres prohibir una combinación duplicada, considera UNIQUE.
Conceptos relacionados
Fuentes técnicas
Una clave compuesta también ayuda a detectar dependencias parciales: aprende a reconocerlas en la guía de normalización de bases de datos hasta 3FN.