
Resumen:
en este tutorial, aprenderás sobre los índices únicos de SQL Server y cómo usarlos para imponer la unicidad de los valores en una o más columnas de una tabla.
Descripción general de los índices únicos de SQL Server
Un índice único garantiza que las columnas de clave de índice no contengan valores duplicados.
Un índice único puede constar de una o varias columnas. Si un índice único tiene una columna, los valores de esta columna serán únicos. En caso de que el índice único tenga varias columnas, la combinación de valores en estas columnas es única.
Cualquier intento de insertar con INSERT INTO o actualizar con UPDATE los datos en las columnas de clave de índice únicas que provoque el duplicado resultará en un error.
Un índice único puede ser agrupado o no agrupado.
Para crear un índice único, utiliza la instrucción CREATE UNIQUE INDEX de la siguiente manera:
CREATE UNIQUE INDEX index_name
ON table_name(column_list);
En esta sintaxis:
- Primero, especifica el nombre del índice único después de las palabras clave CREATE UNIQUE INDEX.
- En segundo lugar, especifica el nombre de la tabla a la que se asoció el índice y una lista de columnas que se incluirán en el índice.
Ejemplos de índices únicos de SQL Server
Tomemos algunos ejemplos del uso de índices únicos.
A) Creación de un índice único de SQL Server para un ejemplo de columna
Esta consulta de SELECT encuentra al cliente con el correo electrónico 'info@estradawebgroup.com':
SELECT
customer_id,
email
FROM
sales.customers
WHERE
email = 'info@estradawebgroup.com';
El optimizador de consultas tiene que escanear todo el índice agrupado para encontrar la fila.
Para acelerar la recuperación de la consulta, puedes agregar un índice no agrupado a la columna de correo electrónico.
Sin embargo, suponiendo que cada cliente tendrá un correo electrónico único, puedes crear un índice único para la columna de correo electrónico.
Debido a que la tabla sales.customers ya tiene datos, primero debes verificar los valores duplicados en la columna de correo electrónico:
SELECT
email,
COUNT(email)
FROM
sales.customers
GROUP BY
email
HAVING
COUNT(email) > 1;
La consulta devuelve un conjunto de registros vacíos. Significa que no hay valores duplicados en la columna de correo electrónico.
Por lo tanto, puedes ir a crear un índice único para la columna de correo electrónico de la tabla sales.customers:
CREATE UNIQUE INDEX ix_cust_email
ON sales.customers(email);
A partir de ahora, el optimizador de consultas aprovechará el índice ix_cust_email y utilizará el método de búsqueda de índice para buscar filas por correo electrónico.
B) Ejemplo de creación de un índice único de SQL Server para varias columnas
Primero, crea una tabla llamada t1 que tenga dos columnas para la demostración:
CREATE TABLE t1 (
a INT,
b INT
);
A continuación, crea un índice único que incluya columnas a y b:
CREATE UNIQUE INDEX ix_uniq_ab
ON t1(a, b);
Luego, inserta una nueva fila en la tabla t1:
INSERT INTO t1(a,b) VALUES(1,1);
Después de eso, inserta otra fila en la tabla t1. Ten en cuenta que el valor 1 se repite en la columna a, pero la combinación de valores en la columna a y b no está duplicada:
INSERT INTO t1(a,b) VALUES(1,2);
Finalmente, inserta una fila que ya existe en la tabla t1:
INSERT INTO t1(a,b) VALUES(1,2);
SQL te regresa el siguiente error:
Cannot insert duplicate key row in object 'dbo.t1' with unique index 'ix_ab'. The duplicate key value is (1, 2).
Índice único de SQL Server y NULL
NULL es especial. Es un marcador que indica la información faltante o no aplicable.
NULL ni siquiera es igual a sí mismo. Sin embargo, cuando se trata de un índice único, SQL Server trata los valores NULL de la misma manera. Significa que si creas un índice único en una columna que acepta valores NULL, solo puedes tener un solo valor NULL en esta columna.
Las siguientes declaraciones crean una nueva tabla llamada t2 y definen un índice único en la columna a:
CREATE TABLE t2(
a INT
);
CREATE UNIQUE INDEX a_uniq_t2
ON t2(a);
Esta consulta inserta NULL en la columna a de la tabla t2:
INSERT INTO t2(a) VALUES(NULL);
Sin embargo, al ejecutar la consulta anterior nuevamente, SQL Server regresa un error debido a valores NULL duplicados:
INSERT INTO t2(a) VALUES(NULL);
INDEX frente a UNIQUE
Tanto el Index como la restricción UNIQUE imponen la unicidad de los valores en una o varias columnas. SQL Server valida los duplicados de la misma manera tanto para el INDEX único como para la restricción UNIQUE.
Cuando creas una restricción UNIQUE, detrás de escena, SQL Server crea un INDEX único asociado con esta restricción.
Sin embargo, la creación de una restricción UNIQUE en las columnas aclara el objetivo del INDEX único.
En este tutorial, has aprendido sobre el índice único (INDEX) de SQL Server y cómo crear un índice único para una o varias columnas de una tabla.