J'utilise SQL Server 2005. Je souhaite contraindre les valeurs d'une colonne à être uniques, tout en autorisant NULLS.
Ma solution actuelle implique un index unique sur une vue comme celle-ci:
CREATE VIEW vw_unq WITH SCHEMABINDING AS
SELECT Column1
FROM MyTable
WHERE Column1 IS NOT NULL
CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)
De meilleures idées?
Bien sûr, vous ne pouvez pas faire cela, car cela va à l'encontre de l'objectif des objets uniques.
Cependant, cette personne semble avoir un travail décent autour de: http://sqlservercodebook.blogspot.com/2008/04/multiple-null-values-in-unique-index-in.html
À l'aide de SQL Server 2008, vous pouvez créer un index filtré: http://msdn.Microsoft.com/en-us/library/cc280372.aspx . (Je vois que Simon a ajouté ceci en tant que commentaire, mais a pensé qu'elle méritait sa propre réponse car ce commentaire est facilement oublié.)
Une autre option est un déclencheur pour vérifier l'unicité, mais cela pourrait affecter les performances.
L'astuce de colonne calculée est largement connue sous le nom de "nullbuster"; mes notes créditent Steve Kass:
CREATE TABLE dupNulls (
pk int identity(1,1) primary key,
X int NULL,
nullbuster as (case when X is null then pk else 0 end),
CONSTRAINT dupNulls_uqX UNIQUE (X,nullbuster)
)