web-dev-qa-db-fra.com

Comment créer un index unique sur une colonne NULL?

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?

98
Nuno G

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

26
willasaywhat

À 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.

101
Phil Haselden

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)
)
71
onedaywhen