Restricción UNIQUE de SQL Server

Resumen: en este tutorial, aprenderá a utilizar la restricción UNIQUE de SQL Server para asegurar la unicidad de los datos contenidos en una columna o un grupo de columnas.

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

Las restricciones de SQL Server UNIQUE permiten asegurar que los datos almacenados en una columna, o en un grupo de columnas, son únicos entre las filas de una tabla.

La siguiente sentencia crea una tabla cuyos datos en la columna email son únicos entre las filas de la tabla hr.persons:

CREATE SCHEMA hr;GOCREATE 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);
Code language: SQL (Structured Query Language) (sql)

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, así:

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));
Code language: SQL (Structured Query Language) (sql)

En el fondo, SQL Server crea automáticamente un UNIQUE índice para reforzar la unicidad de los datos almacenados en las columnas que participan en la UNIQUE restricción. Por lo tanto, si se intenta insertar una fila duplicada, SQL Server rechaza el cambio y devuelve un mensaje de error que indica que se ha infringido la restricción UNIQUE.

La siguiente sentencia inserta una nueva fila en la tabla hr.persons:

INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)

La sentencia funciona como se esperaba. Sin embargo, la siguiente sentencia falla debido al correo electrónico duplicado:

INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)

SQL Server emitió el siguiente mensaje de error:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
Code language: Shell Session (shell)

Si no se especifica un nombre independiente 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__AB6E616417240E4E, que no es del todo legible.

Para asignar un nombre concreto a una UNIQUE restricción, se utiliza 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));
Code language: SQL (Structured Query Language) (sql)

Las siguientes son las ventajas de asignar a una UNIQUE restricción un nombre específico:

  • Es más fácil clasificar el mensaje de error.
  • Puede hacer referencia al nombre de la restricción cuando quiera modificarla.
    • Restricción UNIQUE vs. Restricción PRIMARY KEY

      Aunque ambas restricciones UNIQUE y PRIMARY KEY imponen la unicidad de los datos, debes utilizar la restricción UNIQUE en lugar de la restricción PRIMARY KEY cuando quieras imponer la unicidad de una columna, o de un grupo de columnas, que no sean las columnas de clave primaria.

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

      La siguiente sentencia inserta una fila cuyo valor en la columna email es NULL:

INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)

Ahora, si intentas insertar un NULL más en la columna email, obtendrás un error:

INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Code language: SQL (Structured Query Language) (sql)

Aquí está la salida:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
Code language: SQL (Structured Query Language) (sql)

Restricciones UNIQUE para un grupo de columnas

Para definir una UNIQUE restricción para un grupo de columnas, se escribe como una restricción de tabla con los nombres de las columnas separados por comas como sigue:

CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
Code language: SQL (Structured Query Language) (sql)

El siguiente ejemplo crea una UNIQUE restricción 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));
Code language: SQL (Structured Query Language) (sql)

Añadir restricciones UNIQUE a columnas existentes

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

A continuación se muestra la sintaxis para añadir una UNIQUE restricción a una tabla:

ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Code language: SQL (Structured Query Language) (sql)

Suponga que tiene la siguiente hr.persons tabla:

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),);
Code language: SQL (Structured Query Language) (sql)

La siguiente sentencia añade una UNIQUE restricción a la columna email:

ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
Code language: SQL (Structured Query Language) (sql)

De forma similar, la siguiente sentencia añade una restricción UNIQUE a la columna teléfono:

ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Code language: SQL (Structured Query Language) (sql)

Eliminar restricciones UNIQUE

Para definir una restricción UNIQUE, se utiliza la sentencia ALTER TABLE DROP CONSTRAINT como sigue:

ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
Code language: SQL (Structured Query Language) (sql)

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

ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
Code language: SQL (Structured Query Language) (sql)

Modificar restricciones UNIQUE

SQL Server no tiene ninguna sentencia directa para modificar una UNIQUE restricción, por lo tanto, es necesario eliminar la restricción primero y volver a crearla si se quiere cambiar la restricción.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *