Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

vincolo unico condizionale

Ecco, l'indice filtrato. Dalla documentazione (sottolineatura mia):

Un indice filtrato è un indice non cluster ottimizzato particolarmente adatto per coprire le query che selezionano da un sottoinsieme di dati ben definito. Utilizza un predicato di filtro per indicizzare una porzione di righe nella tabella. Un indice filtrato ben progettato può migliorare le prestazioni delle query e ridurre i costi di manutenzione e archiviazione dell'indice rispetto agli indici a tabella intera.

Ed ecco un esempio che combina un indice univoco con un predicato di filtro:

create unique index MyIndex
on MyTable(ID)
where RecordStatus = 1;

Questo essenzialmente impone l'univocità di ID quando RecordStatus è 1 .

Dopo la creazione di tale indice, una violazione dell'unicità genererà un errore:

Msg 2601, livello 14, stato 1, riga 13
Impossibile inserire una riga di chiave duplicata nell'oggetto 'dbo.MyTable' con indice univoco 'MyIndex'. Il valore della chiave duplicata è (9999).

Nota:l'indice filtrato è stato introdotto in SQL Server 2008. Per le versioni precedenti di SQL Server, vedere questa risposta.