Créer un index unique

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Cette rubrique explique comment créer un index unique sur une table dans SQL Server à 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 Unique Constraints and Check Constraints.

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 que 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

  • 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, FirstNameet 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 aucun index cluster n'existe déjà sur la table.

    Pour plus d'informations, consultez Unique Constraints and Check Constraints et Primary and Foreign Key Constraints.

  • Index indépendant d'une 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 un index avec des 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 .

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 les points de suspension (…).

  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 Enregistrernom_table.

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 denom_table , cochez la ou les cases correspondant à la ou aux colonnes de table à ajouter à l’index unique.

  9. Cliquez sur OK.

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

Utilisation de Transact-SQL

Pour créer un index unique sur une table

  1. Dans l' Explorateur d'objets, connectez-vous à une instance du 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 AdventureWorks2022;  
    GO  
    -- Find an existing index named AK_UnitMeasure_Name 
    -- on the Production.UnitMeasure table and delete it if found. 
    IF EXISTS (SELECT name from sys.indexes  
               WHERE name = N'AK_UnitMeasure_Name'
               AND object_id = OBJECT_ID(N'Production.UnitMeasure', N'U'))   
       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).