SQL

Cómo restringir que los valores de una columna sean únicos en SQL Server con UNIQUE

Estrada Web Group
jiestrada
Cómo restringir que los valores de una columna sean únicos en SQL Server con UNIQUE

Resumen: En este tutorial, aprenderás a utilizar la restricción UNIQUE de SQL Server para garantizar la integridad, precisión y confiabilidad de los datos contenidos en una columna o un grupo de columnas, es decir que no se repitan valores en una columna o en un conjunto de columnas.

Introducción a la restricción UNIQUE de SQL Server

La restricción UNIQUE de SQL Server permite asegurar que los datos almacenados en una columna, o un grupo de columnas, sean únicos entre las filas de una tabla.

El siguiente scrip de SQL crea una tabla cuyos datos en la columna de correo electrónico “email” son únicos entre las filas de la tabla hr.persons:

CREATE SCHEMA hr;
GO

CREATE TABLE hr.persons(
    person_id INT IDENTITY PRIMARY KEY,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE
);

En esta sintaxis, se define la restricción UNIQUE como una restricción de columna. También puedes definir la restricción UNIQUE como una restricción de tabla, de la siguiente manera:

CREATE TABLE hr.persons(
    person_id INT IDENTITY PRIMARY KEY,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255) NOT NULL,
    email VARCHAR(255),
    UNIQUE(email)
);

Lo que hace SQL Server por detrás es crear automáticamente un índice ÚNICO para hacer cumplir la singularidad de los datos almacenados en las columnas que participan en la restricción UNIQUE. Por lo tanto, si intentas insertar una fila duplicada, SQL Server rechaza el cambio y devuelve un mensaje de error que indica que se ha violado la restricción UNIQUE.

La siguiente declaración inserta una nueva fila en la tabla hr.persons:

INSERT INTO hr.persons(first_name, last_name, email)
VALUES('Estrada','Web Group','info@estradawebgroup.com');

El INSERT anterior funciona perfectamente como se esperaba. Sin embargo, la siguiente declaración falla debido al correo electrónico duplicado:

INSERT INTO hr.persons(first_name, last_name, email)
VALUES('Estrada Web Group','EWG','info@estradawebgroup.com');

SQL Server regreso el siguiente mensaje de error:

Infracción de la restricción UNIQUE KEY 'UQ__persons__AB6E6164E5A8D401'. No se puede insertar una clave duplicada en el objeto 'hr.persons'. El valor de la clave duplicada es (info@estradawebgroup.com).

Si no especificas un nombre separado para la restricción UNIQUE, SQL Server generará automáticamente un nombre para ella. En este ejemplo, el nombre de la restricción es UQ__persons__AB6E6164E5A8D401, que no es del todo legible.

Para asignar un nombre particular a una restricción UNIQUE, usa la palabra clave CONSTRAINT de la siguiente manera:

CREATE TABLE hr.persons (
    person_id INT IDENTITY PRIMARY KEY,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255) NOT NULL,
    email VARCHAR(255),
    CONSTRAINT unique_email UNIQUE(email)
);

Los beneficios de asignar un nombre específico a una restricción UNIQUE son los siguientes:

  • Es más fácil clasificar el mensaje de error.
  • Puedes hacer referencia al nombre de la restricción cuando deseas modificarlo.

Diferencias entre la restricción UNIQUE y PRIMARY KEY

Aunque las restricciones UNIQUE y PRIMARY KEY imponen que los datos sean únicos, debes utilizar la restricción UNIQUE en lugar de la restricción PRIMARY KEY cuando deseas aplicar la unicidad de una columna, o un grupo de columnas, que no son las columnas de la llave principal.

A diferencia de las restricciones PRIMARY KEY, las restricciones UNIQUE permiten valores NULL. Además, las restricciones UNIQUE tratan el NULL como un valor regular, por lo tanto, solo permite un NULL por columna.

La siguiente declaración inserta una fila cuyo valor en la columna de correo electrónico es NULL:

INSERT INTO hr.persons(first_name, last_name)
VALUES('Estrada','Web Group');

Ahora, si intentas insertar un NULL más en la columna de correo electrónico, obtendrás un error:

INSERT INTO hr.persons(first_name, last_name)
VALUES('Estrada Web Group','WG');

Aquí está el resultado:

Infracción de la restricción UNIQUE KEY 'UQ__persons__AB6E6164E5A8D401'. No se puede insertar una clave duplicada en el objeto 'hr.persons'. El valor de la clave duplicada es (<NULL>).

Restricciones UNIQUE para un grupo de columnas

Para definir una restricción UNIQUE para un grupo de columnas, escríbela como una restricción de tabla con nombres de columna separados por comas de la siguiente manera:

CREATE TABLE table_name (
    key_column data_type PRIMARY KEY,
    column1 data_type,
    column2 data_type,
    column3 data_type,
    ...,
    UNIQUE (column1,column2)
);

El siguiente ejemplo crea una restricción UNIQUE que consta de dos columnas person_id y skill_id:

CREATE TABLE hr.person_skills (
    id INT IDENTITY PRIMARY KEY,
    person_id int,
    skill_id int,
    updated_at DATETIME,
    UNIQUE (person_id, skill_id)
);

Agregar restricciones UNIQUE a las columnas existentes

Cuando agregas una restricción UNIQUE a una columna existente o un grupo de columnas en una tabla, SQL Server primero examina los datos existentes en estas columnas para asegurarse de que todos los valores sean únicos. Si SQL Server encuentra los valores duplicados, devuelve un error y no agrega la restricción UNIQUE.

A continuación, se muestra la sintaxis de agregar una restricción UNIQUE a una tabla, en la cual primero se debe ejecutar ALTER TABLE:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name 
UNIQUE(column1, column2,...);

Supongamos que tienes la siguiente tabla de personas:

CREATE TABLE hr.persons (
    person_id INT IDENTITY PRIMARY KEY,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255) NOT NULL,
    email VARCHAR(255),
    phone VARCHAR(20),
);  

La siguiente declaración agrega una restricción UNIQUE a la columna de correo electrónico:

ALTER TABLE hr.persons
ADD CONSTRAINT unique_email UNIQUE(email);

De manera similar, la siguiente declaración agrega una restricción UNIQUE a la columna del teléfono:

ALTER TABLE hr.persons
ADD CONSTRAINT unique_phone UNIQUE(phone); 

Eliminar restricciones UNIQUE

Para definir una restricción UNIQUE, utilice la instrucción ALTER TABLE DROP CONSTRAINT de la siguiente manera:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

La siguiente declaración elimina la restricción unique_phone de la tabla hr.person

ALTER TABLE hr.persons
DROP CONSTRAINT unique_phone;

Modificar restricciones UNIQUE

SQL Server no tiene ninguna declaración directa para modificar una restricción UNIQUE, por lo tanto, primero debes eliminar la restricción y volver a crearla si deseas cambiar la restricción.

En este tutorial, has aprendido a utilizar la restricción UNIQUE de SQL Server para asegurarse de que los datos contenidos en una columna o un grupo de columnas sean únicos.

Compartir artículo:

Más artículos geniales

Cómo filtrar por un rango de fechas en SQL Server con el operador BETWEEN

Cómo filtrar por un rango de fechas en SQL Server con el operador BETWEEN

La sentencia u operador BETWEEN de SQL le permite probar fácilmente si una expresión está dentro de un rango de valores. Los valores pueden ser texto, fechas o números.

Ver artículo completo
Cómo usar los valores NULL y los operadores IS NULL y IS NOT NULL para probar si un valor es NULL

Cómo usar los valores NULL y los operadores IS NULL y IS NOT NULL para probar si un valor es NULL

Resumen: en este tutorial, aprenderás sobre la lógica de los valores NULL en SQL Server. También aprenderás a usar los operadores IS NULL y IS NOT NULL para probar si un valor es NULL o no.

Ver artículo completo
Cómo restringir que los valores de una columna sean únicos en SQL Server con UNIQUE

Cómo restringir que los valores de una columna sean únicos en SQL Server con UNIQUE

En este tutorial, aprenderás a utilizar la restricción UNIQUE de SQL Server para garantizar la integridad, precisión y confiabilidad de los datos contenidos en una columna o un grupo de columnas, es decir que no se repitan valores en una columna o en un conjunto de columnas.

Ver artículo completo

Manténgase actualizado

Obtenga excelente contenido en su bandeja de entrada todas las semanas.
Solo contenido excelente, no compartimos su correo electrónico con terceros.
Subir al inicio de la pantalla ;