[SQL 2008] Indici Unique con diversi valori nulli

Published 20 marzo 08 07.53 | abenedetti

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

image

/* 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

image

/* Provo a fare un inserimento con una tessera sanitaria già presente */
insert anagrafica values ('ken','shiro','abc123abc')

image

/* Pulizia */
drop table anagrafica
go

Filed under: , ,

Comments

No Comments

This Blog

Syndication