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
:
Code language: SQL (Structured Query Language) (sql)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);
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í:
Code language: SQL (Structured Query Language) (sql)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));
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
:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
La sentencia funciona como se esperaba. Sin embargo, la siguiente sentencia falla debido al correo electrónico duplicado:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
SQL Server emitió el siguiente mensaje de error:
Code language: Shell Session (shell)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
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:
Code language: SQL (Structured Query Language) (sql)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));
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
:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Ahora, si intentas insertar un NULL
más en la columna email
, obtendrás un error:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Aquí está la salida:
Code language: SQL (Structured Query Language) (sql)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
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:
Code language: SQL (Structured Query Language) (sql)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 UNIQUE
restricción que consta de dos columnas person_id
y skill_id
:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
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:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Suponga que tiene la siguiente hr.persons
tabla:
Code language: SQL (Structured Query Language) (sql)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 sentencia añade una UNIQUE
restricción a la columna email
:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
De forma similar, la siguiente sentencia añade una restricción UNIQUE
a la columna teléfono:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Eliminar restricciones UNIQUE
Para definir una restricción UNIQUE
, se utiliza la sentencia ALTER TABLE DROP CONSTRAINT
como sigue:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
La siguiente sentencia elimina la restricción unique_phone
de la tabla hr.person:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
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.