Creazione di indici univoci

La creazione di un indice univoco garantisce che qualsiasi tentativo di duplicare valori di chiave abbia esito negativo. Non vi sono differenze significative tra la creazione di un vincolo UNIQUE e la creazione di un indice univoco indipendente da un vincolo. La convalida dei dati viene eseguita nello stesso modo e Query Optimizer non applica alcuna distinzione tra un indice univoco creato tramite un vincolo o manualmente. È tuttavia consigliabile creare un vincolo UNIQUE nella colonna quando si desidera garantire l'integrità dei dati. In questo modo, l'obiettivo dell'indice risulta evidente.

Modalità di implementazione tipiche

Gli indici univoci vengono implementati nei modi seguenti:

  • Vincolo PRIMARY KEY o UNIQUE
    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. La colonna chiave primaria non può consentire valori NULL.
    Quando si crea un vincolo UNIQUE, viene creato un indice non cluster univoco per imporre un vincolo UNIQUE per impostazione predefinita. È possibile specificare un indice cluster univoco se nella tabella non esiste già un indice cluster.
    Per ulteriori informazioni, vedere Vincoli PRIMARY KEY e Vincoli UNIQUE.
  • Indice indipendente da un vincolo
    In una tabella è possibile definire più indici non cluster.
    Per ulteriori informazioni, vedere CREATE INDEX (Transact-SQL).
  • Vista indicizzata
    Per creare una vista indicizzata, viene definito un indice cluster univoco in una o più colonne della vista. La vista viene eseguita (materializzata) 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. Per ulteriori informazioni, vedere Creazione di viste indicizzate.

Risoluzione di problemi relativi a valori duplicati

Non è possibile creare un indice o un vincolo univoco se nelle colonne chiave sono presenti valori duplicati. Se, ad esempio, si desidera creare un indice composto univoco nelle colonne FirstName e LastName, ma vi sono due righe della tabella che contengono i valori 'Jane' e 'Smith' nelle colonne FirstName e LastName , l'indice univoco non potrà essere creato. È possibile risolvere questo problema in uno dei modi seguenti:

  • Aggiungere o rimuovere colonne nella definizione dell'indice per creare un composto univoco. Nell'esempio precedente, l'aggiunta di una colonna MiddleName alla definizione dell'indice potrebbe consentire di risolvere il problema di duplicazione.
  • Se i valori duplicati sono il risultato di errori di immissione di dati, correggere manualmente i dati e quindi creare l'indice o il vincolo.

Utilizzo dell'opzione IGNORE_DUP_KEY per gestire valori duplicati

Quando si crea o si modifica un indice o un vincolo univoco, è possibile impostare l'opzione IGNORE_DUP_KEY su ON o su OFF. Questa opzione consente di specificare l'errore relativo ai valori di chiave duplicati in un'istruzione INSERT a più righe in seguito alla creazione dell'indice. Quando l'opzione IGNORE_DUP_KEY è impostata su OFF (impostazione predefinita), Motore di database di SQL Server 2005 rifiuta tutte le righe dell'istruzione quando una o più righe contengono valori di chiave duplicati. Quando l'opzione è impostata su ON, vengono rifiutate solo le righe contenenti valori di chiave duplicati, mentre i valori di chiave non duplicati vengono aggiunti.

Se, ad esempio, una singola istruzione inserisce 20 righe in una tabella con un indice univoco, 10 delle quali contengono valori duplicati, per impostazione predefinita verranno rifiutate tutte le 20 righe. Se, tuttavia, l'opzione IGNORE_DUP_KEY è impostata su ON, verranno rifiutati solo i 10 valori di chiave duplicati, mentre gli altri 10 non duplicati verranno inseriti nella tabella.

L'impostazione dell'opzione viene archiviata nei metadati dell'indice. Per visualizzare l'impostazione corrente, utilizzare la vista del catalogo sys.databases.

[!NOTA] Non è possibile specificare l'opzione IGNORE_DUP_KEY per un indice creato in una vista o per un indice XML.

Gestione dei valori NULL

Ai fini dell'indicizzazione, i valori NULL vengono considerati uguali. Non è pertanto possibile creare un indice univoco o un vincolo UNIQUE se i valori di chiave sono NULL in più di una riga. Selezionare le colonne definite come NOT NULL quando si scelgono le colonne per un indice o un vincolo univoco.

Requisiti di spazio su disco

Il processo per determinare i requisiti di spazio su disco per gli indici univoci è identico a quello relativo agli indici cluster e non cluster. Per informazioni sui requisiti di spazio su disco per gli indici, vedere Individuazione dei requisiti di spazio su disco per gli indici.

Per creare un indice durante la creazione di una tabella

CREATE TABLE (Transact-SQL)

Per creare un indice per una tabella esistente

CREATE INDEX (Transact-SQL)

Vedere anche

Concetti

Fattore di riempimento
Opzione index create memory
Modifica degli indici
Posizionamento di indici in filegroup
Vincoli PRIMARY KEY
Vincoli UNIQUE

Altre risorse

ALTER INDEX (Transact-SQL)
sys.indexes (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005