Listado completo de tutoriales

38 - Restricción unique


Anteriormente aprendimos la restricción "primary key", otra restricción para las tablas es "unique".

La restricción "unique" impide la duplicación de claves alternas (no primarias), es decir, especifica que dos registros no puedan tener el mismo valor en un campo. Se permiten valores nulos. Se pueden aplicar varias restricciones de este tipo a una misma tabla, y pueden aplicarse a uno o varios campos que no sean clave primaria.

Se emplea cuando ya se estableció una clave primaria (como un número de legajo) pero se necesita asegurar que otros datos también sean únicos y no se repitan (como número de documento).

La sintaxis general es la siguiente:

 alter table NOMBRETABLA
 add constraint NOMBRERESTRICCION
 unique (CAMPO);

Ejemplo:

 alter table alumnos
  add constraint UQ_alumnos_documento
  unique (documento);

En el ejemplo anterior se agrega una restricción "unique" sobre el campo "documento" de la tabla "alumnos", esto asegura que no se pueda ingresar un documento si ya existe. Esta restricción permite valores nulos, asi que si se ingresa el valor "null" para el campo "documento", se acepta.

Por convención, cuando demos el nombre a las restricciones "unique" seguiremos la misma estructura: "UQ_NOMBRETABLA_NOMBRECAMPO". Quizá parezca innecesario colocar el nombre de la tabla, pero cuando empleemos varias tablas verá que es útil identificar las restricciones por tipo, tabla y campo.

Recuerde que cuando agregamos una restricción a una tabla que contiene información, PostgreSQL controla los datos existentes para confirmar que cumplen la condición de la restricción, si no los cumple, la restricción no se aplica y aparece un mensaje de error. En el caso del ejemplo anterior, si la tabla contiene números de documento duplicados, la restricción no podrá establecerse; si podrá establecerse si tiene valores nulos.

PostgreSQL controla la entrada de datos en inserciones y actualizaciones evitando que se ingresen valores duplicados.

Ingresemos el siguiente lote de comandos SQL en pgAdmin:

 drop table if exists alumnos;

 create table alumnos(
  legajo char(4) not null,
  apellido varchar(20),
  nombre varchar(20),
  documento char(8)
 );

 -- Agregamos una restricción "primary" para el campo "legajo":
 alter table alumnos
   add constraint PK_alumnos_legajo
   primary key(legajo);

 -- Agregamos una restricción "unique" para el campo "documento":
 alter table alumnos
   add constraint UQ_alumnos_documento
   unique (documento);

 -- Ingresamos algunos registros:
 insert into alumnos values('A111','Lopez','Ana','22222222');
 insert into alumnos values('A123','Garcia','Maria','23333333');
 -- Si intentamos ingresar un legajo o documento repetido, aparece un mensaje de error.

 -- Veamos las restricciones:
 select *
  from information_schema.table_constraints 
  where table_name = 'alumnos';
 -- Aparecen las dos restricciones creadas anteriormente.

La ejecución de este lote de comandos SQL genera una salida similar a:

PostgreSQL pgAdmin unique


Retornar