web-dev-qa-db-ja.com

NULL列に一意のインデックスを作成する方法は?

SQL Server 2005を使用しています。NULLSを許可しながら、列の値を一意に制限します。

私の現在のソリューションには、次のようなビューの一意のインデックスが含まれています。

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)

より良いアイデアはありますか?

98
Nuno G

一意性の目的に違反するため、それができないことを確認してください。

ただし、この人は適切な回避策を持っているようです: http://sqlservercodebook.blogspot.com/2008/04/multiple-null-values-in-unique-index-in.html

26
willasaywhat

SQL Server 2008を使用して、フィルター処理されたインデックス http://msdn.Microsoft.com/en-us/library/cc280372.aspx を作成できます。 (Simonはこれをコメントとして追加しましたが、コメントは簡単に見落とされるため、独自の回答に値すると考えました。)

別のオプションは一意性をチェックするトリガーですが、これはパフォーマンスに影響を与える可能性があります。

101
Phil Haselden

計算列のトリックは、「ヌルバスター」として広く知られています。私のメモは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