[SQL 2008] Indici Unique con diversi valori nulli
Una delle limitazioni degli indici unique è sempre stata quella di poter accettare un solo valore NULL. Limitazione che, ad esempio, non è presente nei database Oracle.
Ovvero, ipotizzando di creare un vincolo unique su una colonna "codice fiscale", viene consentito un solo record in tabella che abbia il "codice fiscale" valorizzato a NULL.
In queste sere, complici ore e piccole diverse pinte di Alaskan Ale, le chiaccherate e le discussioni su SQL Server con gli amici di Solid si sprecano.
Proprio durante una di queste sere Itzik (e chi altro?) salta fuori con la domanda: "Come faccio, in SQL Server 2008, ad avere vincoli unique che possano accettare più valori null?"
Prima risposta: "Non puoi...".
Poi, dopo un altro paio di giri di birra, la risposta è stata semplice: filtered index!
O meglio: unique filtered index :-)
Vediamo un esempio:
use tempdb
go
/* creo una tabella per test */
create table anagrafica
(
idRecord int primary key identity(1,1),
cognome varchar(15),
nome varchar(15),
tesseraSanitaria varchar(10)
)
go
/* creo un indice univoco sulla tessera sanitaria,
filtrato per valori non nulli */
create unique index idxTesseraSanitaria
on anagrafica (tesseraSanitaria)
where tesseraSanitaria is not null
go

/* insert dati di prova - il secondo ed il terzo hanno tessera sanitaria nulla! */
insert anagrafica values ('paolo','rossi','abc123abc')
insert anagrafica values ('paolino','paperino', NULL)
insert anagrafica values ('topo','gigio', NULL)
/* vedo la tabella */
select * from anagrafica
/* Provo a fare un inserimento con una tessera sanitaria già presente */
insert anagrafica values ('ken','shiro','abc123abc')
/* Pulizia */
drop table anagrafica
go