Crear índices únicos

La creación de un índice único garantiza el fracaso de cualquier intento de duplicar valores de clave. No existen diferencias significativas entre crear una restricción UNIQUE y crear un índice único que es independiente de una restricción. La validación de datos se produce de igual modo y el optimizador de consultas no distingue entre un índice único creado mediante una restricción o creado manualmente. Sin embargo, debe crearse una restricción UNIQUE en la columna cuando el objetivo es la integridad de los datos. Esto deja claro el objetivo del índice.

Implementaciones habituales

Los índices únicos se implementan de las formas siguientes:

  • Restricción PRIMARY KEY o UNIQUE

    Cuando se crea una restricción PRIMARY KEY, se crea automáticamente un índice clúster único en las columnas si aún no existe un índice clúster en la tabla o no se ha especificado un índice no clúster. La columna de clave principal no puede permitir valores NULL.

    Cuando cree una restricción UNIQUE, se creará un índice no clúster único para exigir una restricción UNIQUE de forma predeterminada. Si aún no existe ningún índice clúster en la tabla, puede especificar un índice clúster único.

    Para obtener más información, vea Restricciones PRIMARY KEY y Restricciones UNIQUE.

  • Índice independiente de una restricción

    Es posible definir varios índices no clúster únicos en cualquier tabla.

    Para obtener más información, vea CREATE INDEX (Transact-SQL).

  • Vistas indizadas

    Para crear una vista indizada, se define un índice clúster único en una o varias columnas de una vista. La vista se ejecuta (materializa) y el conjunto de resultados se almacena en el nivel hoja del índice, del mismo modo en que los datos de la tabla se almacenan en un índice clúster. Para obtener más información, vea Crear vistas indizadas.

Resolver problemas de valores duplicados

No se puede crear una restricción UNIQUE ni un índice único si existen valores duplicados en las columnas de clave. Si, por ejemplo, desea crear un índice compuesto único en las columnas FirstName y LastName, pero hay dos filas de la tabla que contienen los valores **'Jane'**y 'Smith' en las columnas FirstName y LastName, no se puede crear el índice único. Este problema se puede resolver de una de las siguientes maneras:

  • Agregar o quitar columnas de la definición de índice para crear un índice compuesto único. En el ejemplo anterior, puede que al agregar una columna MiddleName a la definición de índice se resuelva el problema de duplicación.

  • Si los valores duplicados son consecuencia de errores de entrada de datos, corrija manualmente los datos y cree el índice o la restricción.

Usar la opción IGNORE_DUP_KEY para controlar valores duplicados

Cuando se crea o modifica un índice único o una restricción UNIQUE, se puede establecer la opción IGNORE_DUP_KEY en ON o en OFF. Esta opción especifica la respuesta de error cuando una operación de inserción intenta insertar valores de clave duplicados en un índice único. La opción IGNORE_DUP_KEY se aplica solamente a operaciones de inserción realizadas tras crear o volver a generar el índice. La opción no tiene efecto cuando se ejecutan CREATE INDEX, ALTER INDEX o UPDATE. El valor predeterminado es OFF.

  • ON
    Se producirá un mensaje de advertencia cuando se inserten valores de clave duplicados en un índice único. Solo las filas que infrinjan la restricción de unicidad darán error.

  • OFF
    Se producirá un mensaje de error cuando se inserten valores de clave duplicados en un índice único. Toda la operación INSERT se revertirá.

Por ejemplo, si una sola instrucción inserta 20 filas en una tabla con un índice único, pero 10 de esas filas contienen valores de clave duplicados, se rechazarán las 20 filas de forma predeterminada. Sin embargo, si la opción de índice IGNORE_DUP_KEY se establece en ON, solo se rechazarán los 10 valores de clave duplicados; los 10 valores no duplicados se insertarán en la tabla.

IGNORE_DUP_KEY no se puede establecer en ON para los índices creados en una vista, los índices que no sean únicos, los índices XML, los índices espaciales ni los índices filtrados.

Para ver IGNORE_DUP_KEY, utilice sys.indexes.

En la sintaxis compatible con versiones anteriores, WITH IGNORE_DUP_KEY es equivalente a WITH IGNORE_DUP_KEY = ON.

Tratar los valores NULL

A efectos de índices, los valores NULL son comparables a igual. Por lo tanto, no se puede crear un índice único, ni una restricción UNIQUE, si los valores de clave son NULL en más de una fila. Seleccione columnas que se hayan definido como NOT NULL al elegir columnas para un índice único o una restricción UNIQUE.

Requisitos de espacio en disco

El proceso para determinar los requisitos de espacio en disco para los índices únicos es el mismo que el de los índices clúster y no clúster. Para obtener información acerca de los requisitos de espacio en disco para índices, vea Determinar requisitos de espacio en disco del índice.

Para crear un índice durante la creación de una tabla

Para crear un índice en una tabla existente