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,
)
VALUES (
1,
'Juan P茅rez',
'juan@email.com'
);
Insertamos un segundo usuario:
INSERT INTO usuarios (
id,
nombre,
)
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,
)
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:
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