Estructura · control de duplicados

UNIQUE

Impide repetir un valor o una combinación de valores que debe identificar algo de forma exclusiva.

Lectura: 7–9 minEjemplos comprobadosClave compuesta
Contenido de esta guía

Qué garantiza UNIQUE

Una restricción UNIQUE evita que dos filas tengan el mismo valor en la columna o combinación indicada. Es útil para datos como un email de acceso, un código de producto o la pareja formada por alumno y curso.

Una tabla puede tener varias restricciones UNIQUE. En cambio, solo tiene una PRIMARY KEY, que identifica cada fila y además implica ausencia de NULL.

Una columna y una combinación

SQL
CREATE TABLE usuarios_demo (
  id INTEGER PRIMARY KEY,
  email VARCHAR(200) NOT NULL UNIQUE
);

CREATE TABLE inscripciones_demo (
  id INTEGER PRIMARY KEY,
  alumno_id INTEGER NOT NULL,
  curso_id INTEGER NOT NULL,
  UNIQUE (alumno_id, curso_id)
);

En usuarios_demo, ningún email puede repetirse. En inscripciones_demo, un alumno puede aparecer en varios cursos y un curso puede tener varios alumnos, pero la misma pareja no puede registrarse dos veces.

Ejemplo guiado

SQL
INSERT INTO inscripciones_demo (id, alumno_id, curso_id)
VALUES (1, 10, 7);

INSERT INTO inscripciones_demo (id, alumno_id, curso_id)
VALUES (2, 10, 8);

INSERT INTO inscripciones_demo (id, alumno_id, curso_id)
VALUES (3, 10, 7);
Resultado comprobado en SQLite
FilaResultado
(10, 7)Aceptada
(10, 8)Aceptada
(10, 7) repetidaRechazada por UNIQUE

Qué ocurre con NULL

El tratamiento de NULL dentro de una restricción única no es idéntico en todos los motores. SQLite y PostgreSQL permiten varios NULL por defecto; PostgreSQL también permite pedir NULLS NOT DISTINCT. SQL Server, en cambio, trata NULL como un valor a efectos de una clave única normal, por lo que una columna única nullable admite como máximo un NULL.

Cuando el dato debe existir y además no repetirse, expresa ambas reglas: NOT NULL UNIQUE. No dependas del comportamiento de NULL para definir una identidad.

Diagnóstico con clientes
SELECT email, COUNT(*) AS repeticiones
FROM clientes
WHERE email IS NOT NULL
GROUP BY email
HAVING COUNT(*) > 1;

SELECT COUNT(*) AS emails_desconocidos
FROM clientes
WHERE email IS NULL;
Resultado comprobado en la base educativa
ComprobaciónResultado
Emails no nulos repetidos0 grupos
Emails desconocidos3 filas

La unicidad puede añadirse sin limpiar duplicados no nulos. Sin embargo, si el requisito del dominio dice «cada cliente debe tener email», también necesitas resolver esos tres NULL y declarar NOT NULL.

Error frecuente

Marcar cada columna como UNIQUE por separado

No equivale a una combinación única
alumno_id INTEGER UNIQUE,
curso_id INTEGER UNIQUE

Esta definición permitiría un solo registro por alumno y un solo registro por curso. Para impedir solo la pareja duplicada, declara UNIQUE (alumno_id, curso_id).

Comprueba lo aprendido

Básica · restricción compuesta

Evita repetir una valoración

Una tabla guarda valoraciones de productos. Cada cliente puede valorar muchos productos, pero solo una vez cada producto. Define la regla adecuada sobre cliente_id y producto_id.

Compatibilidad entre motores

La restricción sobre una o varias columnas está ampliamente soportada, pero el tratamiento de NULL cambia. SQLite considera distintos los valores NULL dentro de UNIQUE. PostgreSQL también los considera distintos por defecto y permite declarar NULLS NOT DISTINCT cuando el dominio necesita aceptar como máximo un nulo. SQL Server admite como máximo un NULL en una columna con una restricción o índice único normal; si necesitas aplicar unicidad solo a valores no nulos, puedes usar un índice único filtrado con una condición IS NOT NULL. La forma de añadir, nombrar o retirar la restricción también depende del motor.

Qué debes recordar

  • UNIQUE protege valores o combinaciones que no deben repetirse.
  • No sustituye automáticamente a una clave primaria.
  • Una restricción compuesta actúa sobre la combinación completa.
  • Añade NOT NULL cuando el dato también sea obligatorio.

Si además necesitas comparar dos valores opcionales sin que NULL convierta la igualdad en desconocida, consulta IS DISTINCT FROM.

Conceptos relacionados

Fuentes técnicas consultadas