Partager via


Création d'index uniques

La création d'un index unique garantit l'échec de toute tentative de duplication de valeurs de clé. Il n'existe pas de différence notable entre la création d'une contrainte UNIQUE et la création d'un index unique indépendant de toute contrainte. La validation des données se produit d'une manière similaire et l'optimiseur de requête ne fait aucune distinction entre un index unique créé à partir d'une contrainte et un index unique créé manuellement. Il est toutefois conseillé de créer une contrainte UNIQUE sur une colonne lorsque l'intégrité des données doit être garantie. L'objectif de ce type d'index est donc évident.

Implémentations standard

Les index uniques sont implémentés à l'aide des méthodes suivantes :

  • Contrainte PRIMARY KEY ou UNIQUE

    La création d'une contrainte PRIMARY KEY entraîne la création automatique d'un index cluster unique sur la ou les colonnes pour autant qu'il n'existe pas encore d'index cluster dans la table ou qu'un index non-cluster unique n'ait pas été défini explicitement. La colonne de clé primaire ne peut pas contenir de valeurs NULL.

    Lorsque vous créez une contrainte UNIQUE, un index non-cluster unique est créé pour appliquer par défaut une contrainte UNIQUE. Vous pouvez spécifier un index cluster unique si la table n'a pas encore d'index cluster.

    Pour plus d'informations, consultez Contraintes PRIMARY KEY et Contraintes UNIQUE.

  • Index indépendant de toute contrainte

    Vous pouvez définir plusieurs index non-cluster uniques dans une table.

    Pour plus d'informations, consultez CREATE INDEX (Transact-SQL).

  • Vue indexée

    Pour créer une vue indexée, vous devez définir un index cluster unique sur une ou plusieurs colonnes de vue. La vue en question est exécutée et l'ensemble de résultats est stocké au niveau feuille de l'index de la même manière que les données d'une table sont stockées dans un index cluster. Pour plus d'informations, consultez Création de vues indexées.

Résolution des problèmes de valeurs dupliquées

Les index uniques et les contraintes UNIQUE ne peuvent être créés qu'en présence de valeurs dupliquées dans les colonnes de clé. Par exemple, si vous voulez créer un index composite unique sur les colonnes FirstName et LastName, mais si deux des lignes de la table contiennent respectivement les valeurs **'Jane'**et 'Smith' dans les colonnes FirstName et LastName,il est impossible de créer un index unique. Pour résoudre ce problème, procédez de l'une des façons suivantes :

  • Ajoutez ou supprimez des colonnes de la définition de l'index afin de créer un composite unique. Dans l'exemple précédent, l'ajout d'une colonne MiddleName à la définition de l'index pourrait résoudre le problème des valeurs dupliquées.

  • Lorsque les valeurs dupliquées sont issues d'erreurs de saisie des données, corrigez manuellement les données, puis créez l'index ou la contrainte.

Utilisation de l'option IGNORE_DUP_KEY pour le traitement des valeurs dupliquées

Vous pouvez activer (ON) ou désactiver (OFF) l'option IGNORE_DUP_KEY lors de la création ou de la modification d'un index unique ou d'une contrainte unique. Cette option spécifie la réponse d'erreur lorsqu'une opération d'insertion essaie d'insérer des valeurs de clés en double dans un index unique. L'option IGNORE_DUP_KEY s'applique uniquement aux opérations d'insertion après la création ou la reconstruction de l'index. Cette option n'a aucun effet lors de l'exécution de CREATE INDEX, ALTER INDEX ou UPDATE. La valeur par défaut est OFF.

  • ON
    Un message d'avertissement s'affichera lorsque des valeurs de clé en double sont insérées dans un index unique. Seules les lignes qui violent la contrainte d'unicité échouent.

  • OFF
    Un message d'erreur s'affiche lorsque des valeurs de clés en double sont insérées dans un index unique. L'intégralité de l'opération INSERT sera restaurée.

Par exemple, si une seule instruction insère 20 lignes dans une table comportant un index unique et si 10 de ces lignes contiennent des valeurs de clés dupliquées, l'ensemble des 20 lignes est rejeté par défaut. Toutefois, si l'option d'index IGNORE_DUP_KEY a la valeur ON, seules les 10 valeurs de clés dupliquées sont rejetées, tandis que les 10 autres valeurs de clés non dupliquées sont insérées dans la table.

IGNORE_DUP_KEY ne peut pas avoir la valeur ON dans le cas d'index créés sur une vue, d'index non uniques, d'index XML, d'index spatiaux et d'index filtrés.

Pour afficher IGNORE_DUP_KEY, utilisez sys.indexes.

Dans la syntaxe de compatibilité descendante, WITH IGNORE_DUP_KEY est équivalent à WITH IGNORE_DUP_KEY = ON.

Traitement des valeurs NULL

À des fins d'indexation, les valeurs NULL sont comparées sur un pied d'égalité. Il est par conséquent impossible de créer un index unique ou une contrainte UNIQUE lorsque les valeurs de clés sont des valeurs NULL dans une ou plusieurs lignes. Lors de la sélection des colonnes d'un index unique ou d'une contrainte UNIQUE, sélectionnez donc les colonnes qui n'acceptent pas par définition les valeurs NULL.

Espace disque requis

La procédure de détermination de l'espace disque requis est identique à celle des index cluster et des index non-cluster. Pour plus d'informations sur l'espace disque requis pour les index, consultez Détermination de l'espace disque requis par les index.

Pour créer un index lors de la création d'une table

Pour créer un index sur une table existante