SQL Server 2005 に外部キーを持つテーブルがあり、その外部キーを一意の値または null にする必要があります。一意のキーとして設定しましたが、同じテーブルに複数の null を含めることはできません。私がやりたいことをすることは可能ですか?
4 に答える
これは、SQL Server の一意の制約/インデックスに関する長年の不満です。最善の解決策は、スキーマ バインドを使用してビューを作成し、その列に一意のインデックスを配置することです。
Create View dbo.MyUniqueColView
With SchemaBinding
As
Select MyColToBeUnique
From MyTable
Where MyColToBeUnique Is Not Null
GO
Create Unique Clustered Index IX_MyTable_MyColToBeUnique On MyUniqueColView ( MyColToBeUnique )
これを SQL Server 2005 のテーブル レベルの制約で強制することはできませんが、定義を使用してビューをSELECT Col FROM t WHERE Col IS NOT NULL
作成し、その上に一意のクラスター化インデックスを作成することはできます。
SQL Server 2008 では、null ではない値に対してフィルター処理されたインデックスを作成できました。残念ながら、これは 2008 リリースの新機能であるため、2005 ではそのようなことはできません。 .
いつも私の迷惑です。私は標準の「その他」の解釈を好みます。
SQL Server での null を無視する一意の制約の作成を参照してください。3 つの異なるアプローチについて説明します。
解決策 1: フィルター処理されたインデックス。
他の回答から判断すると、これはかなり一般的なようです。私はこのアプローチを試していませんが、 SQL Server 2008が必要です。
解決策 2: 計算列に対する制約
私はこれを使用しましたが、うまくいきます。ただし、リレーションシップを調整する必要がある場合や、セカンダリの非一意のカバー インデックスを追加する必要がある場合があります (一意の制約用に 1 つ、インデックス カバー用に 1 つ)。
解決策 3: UDF チェック制約 (非推奨)
ああ、TSQL の威力 (読み:他に対処すべきこと)。私はこのルートを下っていません。
ハッピーコーディング。