web-dev-qa-db-ja.com

NULLが重複するSQLServerUNIQUE制約

重複の可能性:
SQLサーバーでもnullを許可する一意の制約を作成するにはどうすればよいですか

列に一意の値を強制する必要があるテーブルがあります。この列はNULL可能である必要があり、ビジネスロジックでは、複数のNULL値を許可する必要がありますが、他の重複する値は許可されません。

SQL Server UNIQUE制約は、NULLを通常の値と見なし、重複するNULLを拒否するため、この状況では適切ではありません。

現在、値の一意性はBLLによって付与されているため、それを機能させるための汚いハックを探していません。 DBにこの制約を適用するためのクリーンなソリューションがあるかどうかを知りたいだけです。

そして、ええ、私はそれを行うためのトリガーを書くことができることを知っています:トリガーは唯一の解決策ですか? (またはとにかく最良の解決策?)

32
Patonza

SQL Server 2008を使用している場合(以前のバージョンでは機能しません)、フィルター処理されたインデックスの概念があります。テーブルのフィルタリングされたサブセットにインデックスを作成できます。

CREATE UNIQUE INDEX indexName ON tableName(columns) INCLUDE includeColumns 
WHERE columnName IS NOT NULL
53
LorenVS

この質問 の重複?

計算された列のトリックは、「ヌルバスター」として広く知られています。私のメモはSteveKassの功績です。

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

SQL Server2000で動作します。たとえば、ARITHABORTが必要になる場合があります。

ALTER DATABASE MyDatabase SET ARITHABORT ON
4
onedaywhen

SQL Server 2008を使用している場合は、フィルターインデックスを調べて目的を達成してください。

古いバージョンのSQLServerの場合、トリガーの代替案として、計算列があります。

  1. NULLでない場合は、「一意の」列の値を使用する計算列を作成します。そうでない場合は、行の主キー列(または一意になる任意の列)の値を使用します。
  2. 計算列にUNIQUE制約を適用します。
3
Paul Turner
2

Null値ではなく、値のみを選択してインデックスを作成するビューを作成できます。

ソースは次のとおりです- インデックス付きビューの作成

1

その列ではUNIQUEIDENTIFIERを使用する必要があり、NULLにすることができ、定義上一意でもあります。お役に立てば幸いです。

0
pablox