Creare indici univociCreate Unique Indexes

In questo argomento si applica a: SìSQL ServerSìDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

In questo argomento si illustra come creare un indice univoco per una tabella in SQL Server 2017SQL Server 2017 tramite SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes how to create a unique index on a table in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. Un indice univoco consente di garantire che nella chiave dell'indice non siano contenuti valori duplicati e che pertanto ogni riga della tabella sia univoca.A unique index guarantees that the index key contains no duplicate values and therefore every row in the table is in some way unique. Non vi sono differenze significative tra la creazione di un vincolo UNIQUE e la creazione di un indice univoco indipendente da un vincolo.There are no significant differences between creating a UNIQUE constraint and creating a unique index that is independent of a constraint. La convalida dei dati viene eseguita nello stesso modo e da Query Optimizer non viene applicata alcuna distinzione tra un indice univoco creato tramite un vincolo o manualmente.Data validation occurs in the same manner, and the query optimizer does not differentiate between a unique index created by a constraint or manually created. Tuttavia, se si crea un vincolo UNIQUE nella colonna, l'obiettivo dell'indice è chiaro.However, creating a UNIQUE constraint on the column makes the objective of the index clear. Per ulteriori informazioni sui vincoli UNIQUE, vedere Unique Constraints and Check Constraints.For more information on UNIQUE constraints, see Unique Constraints and Check Constraints.

Quando si crea un indice univoco, è possibile impostare un'opzione che consente di ignorare le chiavi duplicate.When you create a unique index, you can set an option to ignore duplicate keys. Se questa opzione è impostata su e si cerca di creare chiavi duplicate aggiungendo dati che coinvolgono più righe (tramite l'istruzione INSERT), la riga che contiene la chiave duplicata non verrà aggiunta.If this option is set to Yes and you attempt to create duplicate keys by adding data that affects multiple rows (with the INSERT statement), the row containing a duplicate is not added. Se invece l'opzione è impostata su No, l'intera operazione non verrà completata e verrà eseguito il rollback di tutti i dati.If it is set to No, the entire insert operation fails and all the data is rolled back.

Nota

Non è possibile creare un indice univoco in un'unica colonna se in essa è contenuto il valore NULL in più righe.You cannot create a unique index on a single column if that column contains NULL in more than one row. Analogamente, non è possibile creare un indice univoco su più colonne se la combinazione di colonne contiene il valore NULL in più righe.Similarly, you cannot create a unique index on multiple columns if the combination of columns contains NULL in more than one row. Ai fini dell'indicizzazione, questi valori sono considerati duplicati.These are treated as duplicate values for indexing purposes.

Contenuto dell'argomentoIn This Topic

Prima di iniziareBefore You Begin

Vantaggi di un indice univocoBenefits of a Unique Index

  • Gli indici univoci a più colonne consentono di garantire che ogni combinazione di valori nella chiave dell'indice sia univoca.Multicolumn unique indexes guarantee that each combination of values in the index key is unique. Ad esempio, se si crea un indice univoco basato su una combinazione delle colonne LastName, FirstNamee MiddleName , non è possibile che nella tabella siano incluse due righe in cui è presente la stessa combinazione di valori per queste colonne.For example, if a unique index is created on a combination of LastName, FirstName, and MiddleName columns, no two rows in the table could have the same combination of values for these columns.

  • Se i dati in ogni colonna sono univoci, nella stessa tabella è possibile creare sia un indice cluster univoco sia più indici non cluster univoci.Provided that the data in each column is unique, you can create both a unique clustered index and multiple unique nonclustered indexes on the same table.

  • Gli indici univoci consentono di garantire l'integrità dei dati delle colonne definite.Unique indexes ensure the data integrity of the defined columns.

  • Gli indici univoci forniscono informazioni aggiuntive utili a Query Optimizer tramite cui è possibile produrre piani di esecuzione più efficienti.Unique indexes provide additional information helpful to the query optimizer that can produce more efficient execution plans.

Modalità di implementazione tipicheTypical Implementations

Gli indici univoci vengono implementati nei modi seguenti:Unique indexes are implemented in the following ways:

  • Vincolo PRIMARY KEY o UNIQUEPRIMARY KEY or UNIQUE constraint

    Quando si crea un vincolo PRIMARY KEY, viene automaticamente creato un indice cluster univoco nella colonna o nelle colonne se nella tabella non esiste già un indice cluster e non si specifica un indice non cluster univoco.When you create a PRIMARY KEY constraint, a unique clustered index on the column or columns is automatically created if a clustered index on the table does not already exist and you do not specify a unique nonclustered index. La colonna chiave primaria non può supportare i valori NULL.The primary key column cannot allow NULL values.

    Quando si crea un vincolo UNIQUE, viene creato un indice non cluster univoco per applicare un vincolo UNIQUE per impostazione predefinita.When you create a UNIQUE constraint, a unique nonclustered index is created to enforce a UNIQUE constraint by default. È possibile specificare un indice cluster univoco se nella tabella non ne esiste già uno.You can specify a unique clustered index if a clustered index on the table does not already exist.

    Per ulteriori informazioni, vedere Unique Constraints and Check Constraints e Primary and Foreign Key Constraints.For more information, see Unique Constraints and Check Constraints and Primary and Foreign Key Constraints.

  • Indice indipendente da un vincoloIndex independent of a constraint

    In una tabella è possibile definire più indici non cluster.Multiple unique nonclustered indexes can be defined on a table.

    Per altre informazioni, vedere CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).

  • Vista indicizzataIndexed view

    Per creare una vista indicizzata, viene definito un indice cluster univoco in una o più colonne della vista.To create an indexed view, a unique clustered index is defined on one or more view columns. La vista viene eseguita e il set di risultati viene archiviato nel livello foglia allo stesso modo in cui vengono archiviati i dati della tabella in un indice cluster.The view is executed and the result set is stored in the leaf level of the index in the same way table data is stored in a clustered index. Per altre informazioni, vedere Creare viste indicizzate.For more information, see Create Indexed Views.

Limitazioni e restrizioniLimitations and Restrictions

  • Se nei dati sono presenti valori di chiave duplicati, non è possibile creare un indice univoco, un vincolo UNIQUE o un vincolo PRIMARY KEY.A unique index, UNIQUE constraint, or PRIMARY KEY constraint cannot be created if duplicate key values exist in the data.

  • In un indice non cluster univoco possono essere contenute colonne non chiave.A unique nonclustered index can contain included nonkey columns. Per altre informazioni, vedere Creare indici con colonne incluse.For more information, see Create Indexes with Included Columns.

SicurezzaSecurity

AutorizzazioniPermissions

È richiesta l'autorizzazione ALTER per la tabella o la vista.Requires ALTER permission on the table or view. L'utente deve essere un membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_ddladmin e db_owner .User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

Utilizzo di SQL Server Management StudioUsing SQL Server Management Studio

Per creare un indice univoco tramite Progettazione tabelleTo create a unique index by using the Table Designer

  1. In Esplora oggetti espandere il database contenente la tabella in cui si desidera creare un indice univoco.In Object Explorer, expand the database that contains the table on which you want to create a unique index.

  2. Espandere la cartella Tabelle .Expand the Tables folder.

  3. Fare clic con il pulsante destro del mouse sulla tabella nella quale creare un indice univoco e selezionare Progetta.Right-click the table on which you want to create a unique index and select Design.

  4. Selezionare Indici/chiavi nel menu Progettazione tabelle.On the Table Designer menu, select Indexes/Keys.

  5. Nella finestra di dialogo Indici/chiavi fare clic su Aggiungi.In the Indexes/Keys dialog box, click Add.

  6. Selezionare il nuovo indice dalla casella di testo Indice o chiave primari/univoci selezionati .Select the new index in the Selected Primary/Unique Key or Index text box.

  7. In (Generale)nella griglia principale selezionare Tipo , quindi scegliere Indice dall'elenco.In the main grid, under (General), select Type and then choose Index from the list.

  8. Selezionare Colonne, quindi fare clic sul pulsante con i puntini di sospensione (…).Select Columns, and then click the ellipsis (…).

  9. In Nome colonna della finestra di dialogo Colonne indiceselezionare le colonne da indicizzare.In the Index Columns dialog box, under Column Name, select the columns you want to index. È possibile selezionare fino a 16 colonne.You can select up to 16 columns. Per ottenere prestazioni ottimali, selezionare una o due colonne per indice.For optimal performance, select only one or two columns per index. Per ogni colonna selezionata, è possibile specificare se nell'indice i valori della colonna dovranno essere organizzati in ordine crescente o decrescente.For each column you select, indicate whether the index arranges values of this column in ascending or descending order.

  10. Una volta selezionate tutte le colonne per l'indice, fare clic su OK.When all columns for the index are selected, click OK.

  11. In (Generale)nella griglia principale selezionare Univoco , quindi scegliere dall'elenco.In the grid, under (General), select Is Unique and then choose Yes from the list.

  12. Facoltativo: In Progettazione tabellenella griglia principale selezionare Ignora chiavi duplicate , quindi scegliere dall'elenco.Optional: In the main grid, under Table Designer, select Ignore Duplicate Keys and then choose Yes from the list. Eseguire questa operazione se si desidera ignorare i tentativi per aggiungere dati che comporterebbero la creazione di una chiave duplicata nell'indice univoco.Do this if you want to ignore attempts to add data that would create a duplicate key in the unique index.

  13. Scegliere Chiudi.Click Close.

  14. Nel menu File scegliere Salvanome_tabella.On the File menu, click Savetable_name.

Creare un indice univoco tramite Esplora oggettiCreate a unique index by using Object Explorer

  1. In Esplora oggetti espandere il database contenente la tabella in cui si desidera creare un indice univoco.In Object Explorer, expand the database that contains the table on which you want to create a unique index.

  2. Espandere la cartella Tabelle .Expand the Tables folder.

  3. Espandere la tabella in cui si desidera creare un indice univoco.Expand the table on which you want to create a unique index.

  4. Fare clic con il pulsante destro del mouse sulla cartella Indici , scegliere Nuovo indicee selezionare Indice non cluster.Right-click the Indexes folder, point to New Index, and select Non-Clustered Index….

  5. Nella pagina Generale della finestra di dialogo Nuovo indice immettere il nome del nuovo indice nella casella Nome indice .In the New Index dialog box, on the General page, enter the name of the new index in the Index name box.

  6. Selezionare la casella di controllo Univoco .Select the Unique check box.

  7. In Colonne chiave indicefare clic su Aggiungi.Under Index key columns, click Add….

  8. Nella finestra di dialogo Seleziona colonne datable_name selezionare le caselle di controllo delle colonne della tabella da aggiungere all'indice univoco.In the Select Columns fromtable_name dialog box, select the check box or check boxes of the table column or columns to be added to the unique index.

  9. Scegliere OK.Click OK.

  10. Nella finestra di dialogo Nuovo indice fare clic su OK.In the New Index dialog box, click OK.

Utilizzo di Transact-SQLUsing Transact-SQL

Per creare un indice univoco per una tabellaTo create a unique index on a table

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute.

    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  
    

    Per altre informazioni, vedere CREATE INDEX (Transact-SQL).For more information, see CREATE INDEX (Transact-SQL).