viernes, 17 de julio de 2026

馃悩 La Restricci贸n UNIQUE en PostgreSQL

Hasta ahora hemos visto las restricciones:

  • NULL

  • NOT NULL

  • DEFAULT

Estas nos permiten controlar si una columna puede estar vac铆a o si debe recibir un valor predeterminado.

Sin embargo, existe otro problema com煤n:

¿C贸mo evitar que un mismo valor se almacene varias veces?

Por ejemplo:

  • Dos usuarios con el mismo correo electr贸nico.

  • Dos empleados con el mismo n煤mero de empleado.

  • Dos productos con el mismo c贸digo.

Para resolver este problema PostgreSQL proporciona la restricci贸n UNIQUE.


馃 ¿Qu茅 es UNIQUE?

La restricci贸n UNIQUE garantiza que los valores almacenados en una columna no se repitan.

En otras palabras:

✅ Valores diferentes son permitidos.

❌ Valores duplicados generan error.


馃彈️ Sintaxis B谩sica

La forma m谩s simple de definirla es durante la creaci贸n de una tabla.

CREATE TABLE usuarios (

id INTEGER,

nombre VARCHAR(100),

email VARCHAR(200) UNIQUE

);

En este ejemplo:

  • Dos usuarios pueden tener distintos correos.

  • No pueden existir dos usuarios con el mismo correo.


✅ Insertar Valores 脷nicos

Creamos la tabla:

CREATE TABLE usuarios (

id INTEGER,

nombre VARCHAR(100),

email VARCHAR(200) UNIQUE

);

Insertamos el primer usuario:

INSERT INTO usuarios (

id,

nombre,

email

)

VALUES (

1,

'Juan P茅rez',

'juan@email.com'

);

Insertamos un segundo usuario:

INSERT INTO usuarios (

id,

nombre,

email

)

VALUES (

2,

'Ana L贸pez',

'ana@email.com'

);

Ambos registros se insertan correctamente porque los correos son diferentes.


❌ Intentar Insertar un Duplicado

Ahora intentemos insertar un correo que ya existe.

INSERT INTO usuarios (

id,

nombre,

email

)

VALUES (

3,

'Carlos Garc铆a',

'juan@email.com'

);

PostgreSQL devolver谩 un error similar a:

ERROR: duplicate key value violates unique constraint

La inserci贸n falla porque el valor:

juan@email.com

ya se encuentra almacenado.


馃攳 Verificando los Datos

Podemos consultar la tabla:

SELECT *

FROM usuarios;

Resultado:

id | nombre | email

----+-------------+----------------

1 | Juan P茅rez | juan@email.com

2 | Ana L贸pez | ana@email.com

Observa que el tercer registro nunca fue insertado.


馃摑 UNIQUE en Otras Columnas

La restricci贸n no est谩 limitada a correos electr贸nicos.

Tambi茅n suele utilizarse en:

  • RFC

  • CURP

  • N煤mero de empleado

  • C贸digo de producto

  • Nombre de usuario

  • N煤mero de serie

Ejemplo:

CREATE TABLE productos (

codigo VARCHAR(50) UNIQUE,

nombre VARCHAR(100),

precio NUMERIC(10,2)

);


馃И Ejemplo Completo

Crear Tabla

CREATE TABLE empleados (

numero_empleado INTEGER UNIQUE,

nombre VARCHAR(100),

departamento VARCHAR(100)

);


Insertar Datos

INSERT INTO empleados (

numero_empleado,

nombre,

departamento

)

VALUES

(

1001,

'Juan P茅rez',

'Tecnolog铆a'

),

(

1002,

'Ana L贸pez',

'Finanzas'

);


Consultar

SELECT *

FROM empleados;

Resultado:

numero_empleado | nombre | departamento

----------------+-------------+--------------

1001 | Juan P茅rez | Tecnolog铆a

1002 | Ana L贸pez | Finanzas


Intentar duplicar el n煤mero de empleado

INSERT INTO empleados (

numero_empleado,

nombre,

departamento

)

VALUES (

1001,

'Carlos Garc铆a',

'Ventas'

);

Resultado:

ERROR: duplicate key value violates unique constraint


⚠️ UNIQUE y Valores NULL

Este es uno de los comportamientos que m谩s confunde a quienes comienzan con PostgreSQL.

Supongamos la siguiente tabla:

CREATE TABLE clientes (

id INTEGER,

email VARCHAR(200) UNIQUE

);

Ahora insertamos:

INSERT INTO clientes (id, email)

VALUES (1, NULL);

y posteriormente:

INSERT INTO clientes (id, email)

VALUES (2, NULL);

Ambas inserciones son v谩lidas.


¿Por qu茅 ocurre esto?

Porque PostgreSQL considera que:

NULL != NULL

Un valor nulo significa "valor desconocido", por lo que m煤ltiples registros pueden contener NULL en una columna UNIQUE.

Por esta raz贸n es com煤n combinar:

UNIQUE

con

NOT NULL


馃敀 UNIQUE + NOT NULL

Esta es probablemente la combinaci贸n m谩s utilizada.

CREATE TABLE usuarios (

id INTEGER,

email VARCHAR(200) NOT NULL UNIQUE

);

Con esta definici贸n:

✅ El correo es obligatorio.

✅ No puede repetirse.

❌ No puede ser NULL.


馃彈️ UNIQUE a Nivel de Tabla

Hasta ahora hemos definido UNIQUE directamente sobre una columna.

Tambi茅n puede definirse al final de la tabla.

CREATE TABLE usuarios (

id INTEGER,

nombre VARCHAR(100),

email VARCHAR(200),

UNIQUE(email)

);

El comportamiento es exactamente el mismo.


馃敡 Agregar UNIQUE a una Tabla Existente

Si la tabla ya existe:

ALTER TABLE usuarios

ADD CONSTRAINT uq_usuarios_email

UNIQUE(email);

A partir de ese momento PostgreSQL impedir谩 valores duplicados.


馃敡 Eliminar una Restricci贸n UNIQUE

Primero identificamos el nombre de la restricci贸n.

Posteriormente:

ALTER TABLE usuarios

DROP CONSTRAINT uq_usuarios_email;


馃幆 UNIQUE en M煤ltiples Columnas

Tambi茅n podemos exigir que una combinaci贸n de columnas sea 煤nica.

Supongamos una tabla de cursos.

CREATE TABLE inscripciones (

alumno VARCHAR(100),

curso VARCHAR(100),

CONSTRAINT uq_inscripciones_alumno_curso

UNIQUE(alumno, curso)

);

Esto significa:

✅ Juan puede inscribirse a SQL.

✅ Juan puede inscribirse a PostgreSQL.

✅ Ana puede inscribirse a SQL.

❌ Juan no puede inscribirse dos veces al mismo curso.


Ejemplo

INSERT INTO inscripciones

VALUES ('Juan', 'PostgreSQL');

Luego:

INSERT INTO inscripciones

VALUES ('Juan', 'PostgreSQL');

Resultado:

ERROR: duplicate key value violates unique constraint


馃挕 Buenas Pr谩cticas

Utiliza UNIQUE en datos que realmente deban ser 煤nicos

Ejemplos comunes:

email

usuario

rfc

curp

codigo_producto

numero_empleado


Comb铆nalo con NOT NULL cuando corresponda

En muchos casos ambos requisitos son necesarios.

email VARCHAR(200) NOT NULL UNIQUE


Asigna nombres descriptivos a las restricciones

Por ejemplo:

ALTER TABLE usuarios

ADD CONSTRAINT uq_usuarios_email

UNIQUE(email);

Esto facilita la identificaci贸n de errores y el mantenimiento de la base de datos.


No agregues UNIQUE innecesariamente

Preg煤ntate siempre:

¿Este dato realmente debe ser 煤nico?

Por ejemplo, normalmente no tendr铆a sentido que el nombre de una persona fuera 煤nico:

nombre VARCHAR(100) UNIQUE

Podr铆an existir m煤ltiples personas llamadas "Juan P茅rez".


✅ Conclusi贸n

La restricci贸n UNIQUE permite garantizar que ciertos valores no se repitan dentro de una tabla.

Los conceptos m谩s importantes son:

  • UNIQUE evita valores duplicados.

  • Puede definirse sobre una o varias columnas.

  • Los intentos de insertar valores repetidos generan error.

  • Varias filas pueden contener NULL en una columna UNIQUE.

  • Es habitual combinar UNIQUE con NOT NULL.

  • Se utiliza frecuentemente para correos electr贸nicos, nombres de usuario, c贸digos de producto y n煤meros de empleado.

No hay comentarios:

Publicar un comentario