Créer des index uniques

Cette rubrique explique comment créer un index unique sur une table dans SQL Server 2012 à l'aide de SQL Server Management Studio ou de Transact-SQL. Un index unique garantit que la clé d'index ne contient aucune valeur dupliquée et que, par conséquent, chaque ligne de la table est unique d'une certaine manière. 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. Toutefois, la création d'une contrainte UNIQUE sur la colonne permet de clarifier l'objectif de l'index. Pour plus d'informations sur les contraintes UNIQUE, consultez Contraintes uniques et contraintes de validation.

Lorsque vous créez un index unique, une option vous permet d'ignorer les clés en double. Si vous affectez à cette option la valeur Oui et si vous tentez de créer une clé dupliquée en ajoutant des données concernant plusieurs lignes (avec l'instruction INSERT), la ligne qui contient le doublon n'est pas ajoutée. Si elle a la valeur Non, l'intégralité de l'opération INSERT échoue et toutes les données sont restaurées.

[!REMARQUE]

Il n'est pas possible de créer un index unique sur une seule colonne si cette colonne contient des valeurs null dans plusieurs lignes. De même, il n'est pas possible de créer un index unique sur plusieurs colonnes si la combinaison des colonnes contient des valeurs null dans plusieurs lignes. En effet, ces valeurs sont traitées comme des doublons par l'indexation.

Dans cette rubrique

  • Avant de commencer :

    Avantages d'un index unique

    Implémentations types

    Limitations et restrictions

    Sécurité

  • Pour créer un index unique sur une table, utilisez :

    SQL Server Management Studio

    Transact-SQL

Avant de commencer

Avantages d'un index unique

  • Les index uniques multicolonnes garantissent que chaque combinaison de valeurs dans la clé d'index est unique. Par exemple, si un index unique est créé sur une combinaison des colonnes LastName, FirstName et MiddleName, deux lignes de la table ne peuvent pas posséder la même combinaison de valeurs pour ces colonnes.

  • À condition que les données contenues dans chaque colonne soient uniques, vous pouvez créer à la fois un index cluster unique et plusieurs index non cluster uniques sur la même table.

  • Les index uniques garantissent l'intégrité des données des colonnes définies.

  • Les index uniques fournissent des informations supplémentaires utiles à l'optimiseur de requête qui peut produire des plans d'exécution plus efficaces.

Implémentations types

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 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 uniques et contraintes de validation et Contraintes de clé primaire et de clé étrangère.

  • 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 est exécutée et le jeu de résultats est stocké au niveau feuille de l'index de la même manière que les données de table sont stockées dans un index cluster. Pour plus d'informations, consultez Créer des vues indexées.

Limitations et restrictions

  • Un index unique, une contrainte UNIQUE ou une contrainte PRIMARY KEY ne peuvent pas être créés si les données comportent des valeurs de clé dupliquées.

  • Un index non cluster unique peut contenir des colonnes non-clés incluses. Pour plus d'informations, consultez Créer des index avec colonnes incluses.

Sécurité

Autorisations

Nécessite une autorisation ALTER sur la table ou la vue. L'utilisateur doit être membre du rôle serveur fixe sysadmin ou des rôles de base de données fixes db_ddladmin et db_owner.

Icône de flèche utilisée avec le lien Retour en haut[Haut de la page]

Utilisation de SQL Server Management Studio

Pour créer un index unique à l'aide du Concepteur de tables

  1. Dans l'Explorateur d'objets, développez la base de données qui contient la table sur laquelle vous souhaitez créer un index unique.

  2. Développez le dossier Tables.

  3. Cliquez avec le bouton droit sur la table sur laquelle vous souhaitez créer un index unique, puis sélectionnez Conception.

  4. Dans le menu Concepteur de tables, sélectionnez Index/Clés.

  5. Dans la boîte de dialogue Index/Clés, cliquez sur Ajouter.

  6. Sélectionnez le nouvel index dans la zone de texte Clé ou index Primary/Unique sélectionné.

  7. Dans la grille principale, sous (Général), sélectionnez Type puis choisissez Index dans la liste.

  8. Sélectionnez Colonnes, puis cliquez sur le bouton de sélection (…).

  9. Dans la boîte de dialogue Colonnes d'index, sous Nom de la colonne, sélectionnez les colonnes que vous souhaitez indexer. Vous pouvez sélectionner jusqu'à 16 colonnes. Si vous souhaitez que les performances soient optimales, évitez d'en sélectionner plus de deux par index. Pour chaque colonne sélectionnée, vous pouvez indiquer si l'index organise ses valeurs en ordre croissant ou décroissant.

  10. Lorsque toutes les colonnes sont sélectionnées pour l'index, cliquez sur OK.

  11. Dans la grille, sous (Général), sélectionnez Est unique, puis choisissez Oui dans la liste.

  12. Facultatif : Dans la grille principale, sous Concepteur de tables, sélectionnez Ignorer les clés dupliquées, puis choisissez Oui dans la liste. Effectuez cette opération si vous souhaitez ignorer les tentatives d'ajout de données qui créeraient une clé dupliquée dans l'index unique.

  13. Cliquez sur Fermer.

  14. Dans le menu Fichier, cliquez sur Enregistrer table_name.

Créer un index unique à l'aide de l'Explorateur d'objets

  1. Dans l'Explorateur d'objets, développez la base de données qui contient la table sur laquelle vous souhaitez créer un index unique.

  2. Développez le dossier Tables.

  3. Développez la table sur laquelle vous souhaitez créer un index unique.

  4. Cliquez avec le bouton droit sur le dossier Index, pointez sur Nouvel index, puis sélectionnez Index non cluster….

  5. Dans la boîte de dialogue Nouvel index, sur la page Général, entrez le nom du nouvel index dans la zone Nom de l'index.

  6. Activez la case à cocher Unique.

  7. Sous Colonnes clés d'index, cliquez sur Ajouter….

  8. Dans la boîte de dialogue Sélectionnez les colonnes à partir de table_name, activez la ou les cases à cocher de la ou des colonnes de table à ajouter à l'index unique.

  9. Cliquez sur OK.

  10. Dans la boîte de dialogue Nouvel index, cliquez sur OK.

Icône de flèche utilisée avec le lien Retour en haut[Haut de la page]

Utilisation de Transact-SQL

Pour créer un index unique sur une table

  1. Dans l'Explorateur d'objets, connectez-vous à une instance de Moteur de base de données.

  2. Dans la barre d'outils standard, cliquez sur Nouvelle requête.

  3. Copiez et collez l'exemple suivant dans la fenêtre de requête, puis cliquez sur Exécuter.

    USE AdventureWorks2012;
    GO
    -- Find an existing index named AK_UnitMeasure_Name and delete it if found
    IF EXISTS (SELECT name from sys.indexes
               WHERE name = N'AK_UnitMeasure_Name') 
       DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure; 
    GO
    -- Create a unique index called AK_UnitMeasure_Name
    -- on the Production.UnitMeasure table using the Name column.
    CREATE UNIQUE INDEX AK_UnitMeasure_Name 
       ON Production.UnitMeasure (Name); 
    GO
    

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

Icône de flèche utilisée avec le lien Retour en haut[Haut de la page]