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ò supportare i valori NULL.

    Quando si crea un vincolo UNIQUE, viene creato un indice cluster univoco per imporre un vincolo UNIQUE per impostazione predefinita. È possibile specificare un indice cluster univoco se nella tabella non ne esiste già uno.

    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 specifica l'errore restituito quando un'operazione di inserimento tenta di inserire valori di chiave duplicati in un indice univoco. L'opzione IGNORE_DUP_KEY viene applicata solo alle operazioni di inserimento eseguite dopo la creazione o la ricompilazione dell'indice. Non ha alcun effetto se si esegue CREATE INDEX, ALTER INDEX o UPDATE. Il valore predefinito è OFF.

  • ON
    Viene visualizzato un messaggio di avviso quando i valori di chiave duplicati vengono inseriti in un indice univoco. Avranno esito negativo solo le righe che violano il vincolo di unicità.

  • OFF
    Viene visualizzato un messaggio di errore quando i valori di chiave duplicati vengono inseriti in un indice univoco. Viene eseguito il rollback dell'intera operazione INSERT.

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'opzione IGNORE_DUP_KEY non può essere impostata su ON per gli indici creati in una vista, gli indici non univoci e gli indici XML, spaziali e filtrati.

Per visualizzare IGNORE_DUP_KEY, utilizzare sys.indexes.

Per quanto riguarda la sintassi compatibile con le versioni precedenti, WITH IGNORE_DUP_KEY equivale a WITH IGNORE_DUP_KEY = ON.

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

Per creare un indice per una tabella esistente