Volver a: Tutorial de SQL Server Para Principiantes y Profesionales
Índice Único de SQL Server
En este artículo, voy a hablar del Índice Único de SQL Server con ejemplos. Cuando creamos un índice de SQL Server utilizando la opción Único entonces se llama un Índice Único de SQL Server. Entonces la(s) columna(s) sobre la(s) que se crea el índice único no permitirá valores duplicados, es decir, funciona como una restricción única.
El índice único de SQL Server da garantías de que la columna sobre la que se crea el índice no aceptará ningún valor duplicado. Por favor, lee los siguientes artículos que son necesarios para entender el Índice Único de SQL Server.
Índices de SQL Server
Índice agrupado en SQL Server
Índices no agrupados en SQL Server
Entendamos el Índice Único de SQL Server con un ejemplo.
Vamos a utilizar la siguiente tabla Empleados. Utilice el siguiente Script SQL para crear y poblar la tabla Empleados con datos de prueba.
Como hemos marcado la columna Id como la columna Clave Primaria en la tabla Empleados, por defecto se crea un índice agrupado único en la columna Id con Id como clave de índice. Para comprobar si se crea un índice agrupado único o no, utilice el procedimiento almacenado del sistema sp_helpindex como se muestra a continuación.
sp_helpindex Empleados
Desde el diagrama anterior, se muestra claramente que se crea un índice agrupado único en la columna Id de la tabla Empleados. Como tenemos un ÍNDICE CLUSTERIZADO ÚNICO en la columna Id de la tabla Empleados, cualquier intento de duplicar los valores clave, es decir, los valores de la columna Id de la tabla Empleados, arrojará un error.
Intentemos insertar dos registros con los mismos valores Id como se muestra a continuación.
INSERT INTO Empleados VALUES(1,’Pranaya’, ‘Rout’,4500,’Hombre’,’Mumbai’)
INSERT INTO Empleados VALUES(1,’Anurag’, ‘Mohanty’,2500,’Hombre’,’Delhi’)
Cuando intentamos insertar los dos registros anteriores, nos da el siguiente error que asegura que no podemos insertar valores clave duplicados cuando hay un índice único en SQL Server.
‘Violación de la restricción PRIMARY KEY ‘PK__Employee__3214EC0775FF9526’. No se puede insertar una clave duplicada en el objeto ‘dbo.Empleados’. El valor de la clave duplicada es (1)’.
Ahora vamos a intentar eliminar el índice agrupado único en la columna Id utilizando el comando DROP como se muestra a continuación.
DROP INDEX Employees.PK__Employee__3214EC0775FF9526
Cuando intentamos ejecutar el comando DROP INDEX anterior, nos da el siguiente error
‘No se permite un DROP INDEX explícito en el índice ‘Employees.PK__Employee__3214EC0775FF9526′. Se está utilizando para la aplicación de la restricción PRIMARY KEY.’
Por lo tanto, el mensaje de error anterior demuestra que SQL server utiliza internamente el índice UNIQUE para aplicar la singularidad de los valores y la clave primaria.
Para ver la clave primaria y el índice, expanda la carpeta de claves en la ventana del explorador de objetos, y podrá ver la restricción de clave primaria. Del mismo modo, expanda la carpeta de índices en la ventana del explorador de objetos y podrá ver el índice único agrupado como se muestra en el siguiente diagrama.
Como puede ver en el explorador de objetos sólo muestra la palabra agrupada. Para confirmar si es un índice ÚNICO o no, haz clic con el botón derecho del ratón sobre el índice y selecciona propiedades. La ventana de propiedades muestra la casilla ÚNICA seleccionada como se muestra en el siguiente diagrama.
ELIMINAR Índice Agrupado
No podemos eliminar el índice clusterizado único mediante el comando DROP pero SQL Server nos permite eliminar el índice clusterizado único desde el explorador de objetos. Así que haz clic con el botón derecho del ratón sobre el índice, y luego selecciona la opción DELETE y finalmente haz clic en OK. Puedes ver que junto con el índice UNIQUE, también se elimina la restricción de clave primaria.
Ahora, vamos a intentar insertar algunos valores duplicados para la columna ID de los Empleados y puedes ver que las filas se insertan en la tabla sin ningún error de violación de clave primaria.
INSERT INTO Employees VALUES(2,’Priyanka’, ‘Dwegaan’,4500,’Female’,’Mumbai’)
INSERT INTO Employees VALUES(2,’Preety’, ‘Tiwary’,2500,’FEmale’,’Delhi’)
Una vez que inserte los dos registros anteriores, verifique la tabla de empleados como se muestra a continuación.
SELECT * FROM Empleados
Salida:
Así que esto demuestra que el índice UNIQUE en SQL Server se utiliza para reforzar la unicidad de valores y la restricción de clave primaria.
La UNICIDAD es una propiedad de un índice en SQL Server y tanto los índices CLUSTERED como los NON-CLUSTERED pueden ser creados como UNIQUE.
NOTA:
No podemos crear un índice único en una sola columna si esa columna contiene NULL en más de una fila. Del mismo modo, no podemos crear un índice único en múltiples columnas si la combinación de columnas contiene NULL en más de una fila. Estos se tratan como valores duplicados a efectos de indexación.
CREATE UNIQUE NONCLUSTERED INDEX UIX_Employees_FastNamee_LastName On Employees(FastName, LastName)
El índice único no agrupado anterior asegura que no hay 2 entradas en el índice que tengan los mismos nombres rápidos y apellidos.
En el artículo de Unique Constraint, ya comentamos que una Unique Constraint en SQL Server se puede utilizar para reforzar la unicidad de los valores, a través de una o más columnas.
NOTA: La Unique constraint en SQL Server puede ser unique clustered o unique non-clustered. Al crear un índice en SQL Server, si no se especifica si es agrupado o no agrupado, por defecto será no agrupado.
¿Cuáles son las diferencias entre las restricciones UNIQUE y el índice UNIQUE?
No hay grandes diferencias entre una restricción única y un índice único en SQL Server. De hecho, cuando añadimos una restricción única, se crea un índice único entre bastidores.
Para entender esto, vamos a añadir una restricción única en la columna Ciudad de la tabla Empleados
ALTER TABLE Empleados ADD CONSTRAINT UQ_Emplyees_City UNIQUE (Ciudad)
Ahora cuando ejecutamos la consulta anterior nos da el siguiente error.
La sentencia CREATE UNIQUE INDEX ha finalizado porque se ha encontrado una clave duplicada para el nombre del objeto ‘dbo.Employees’ y el nombre del índice ‘UQ_Emplyees_City’. El valor de la clave duplicada es (Mumbai).
Esto se debe a que ya tenemos valores duplicados en la columna Ciudad de la tabla Empleados y, por lo tanto, no permite crear un índice único en la columna Ciudad.
Así que vamos a truncar la tabla primero y luego crear el índice como se muestra a continuación.
TRUNCATE TABLE Employees
ALTER TABLE Employees ADD CONSTRAINT UQ_Emplyees_City UNIQUE (City)
Ahora, la sentencia se ha ejecutado correctamente.
En este punto, puede esperar que se cree una restricción única dentro de la carpeta de restricciones. Actualice y expanda la carpeta de restricciones en la ventana del explorador de objetos y podrá ver que la restricción no está presente en esta carpeta. Ahora, actualice y expanda la carpeta ‘indexes’ y en la carpeta indexes, puede ver un índice UNIQUE NON-CLUSTERED con el nombre UQ_Employees_City como se muestra a continuación.
También puedes verificar las restricciones disponibles de una tabla utilizando el procedimiento almacenado del sistema SP_HELPCONSTRAINT como se muestra a continuación
EXECUTE SP_HELPCONSTRAINT Empleados
Nos dará el siguiente resultado.
Cuando creamos una restricción UNIQUE en SQL Server, en realidad crea un índice UNIQUE detrás de la escena. Así que un índice UNIQUE en SQL Server puede ser creado explícitamente mediante el uso de la sentencia CREATE INDEX o indirectamente mediante el uso de una restricción UNIQUE.
¿Cuándo se debe crear una restricción única sobre un índice único?
Para dejar las intenciones claras crear una restricción única cuando la integridad de los datos es el objetivo. Esto deja muy claro el objetivo del índice. En cualquiera de los dos casos, los datos se validan de la misma manera, y el optimizador de consultas no diferencia entre un índice único creado por una restricción única o creado manualmente.
NOTA:
Cuando creamos una restricción PRIMARY KEY en SQL Server, se crea automáticamente un índice único agrupado en la columna o columnas si no existe ya un índice agrupado en la tabla y no especificamos un índice único no agrupado.
Cuando creamos una restricción UNIQUE en SQL Server, se crea automáticamente un índice único no agrupado para reforzar una restricción UNIQUE por defecto. Puede especificar un índice único agrupado si no existe ya un índice agrupado en la tabla.
No podemos crear una restricción UNIQUE o un índice UNIQUE en SQL Server en una tabla existente si la tabla contiene valores duplicados en las columnas clave. Para solucionarlo, es necesario eliminar las columnas clave de la definición del índice o eliminar o actualizar los valores duplicados.
Por defecto, no se permiten valores duplicados en las columnas clave, cuando se tiene un índice o restricción única. Por ejemplo, si intenta insertar 10 filas, de las cuales 5 filas contienen duplicados, entonces todas las 10 filas son rechazadas. Sin embargo, si quiero que sólo se rechacen las 5 filas duplicadas y se acepten las 5 filas no duplicadas, puedo utilizar la opción IGNORE_DUP_KEY. A continuación se muestra un ejemplo de uso de la opción IGNORE_DUP_KEY.
CREATE UNIQUE INDEX IX_Employees_City ON Employees(City) WITH IGNORE_DUP_KEY
Limitaciones y restricciones
El índice único, la restricción UNIQUE o la restricción PRIMARY KEY no pueden crearse si existen valores clave duplicados en los datos.
Un índice único no agrupado puede contener columnas no clave incluidas
En el próximo artículo, hablaré de cómo utilizar el índice en la cláusula GROUP BY en SQL Server con ejemplos.