8

SQL Server 2005 に外部キーを持つテーブルがあり、その外部キーを一意の値または null にする必要があります。一意のキーとして設定しましたが、同じテーブルに複数の null を含めることはできません。私がやりたいことをすることは可能ですか?

4

4 に答える 4

9

これは、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 )
于 2011-05-12T18:55:57.073 に答える
1

これを SQL Server 2005 のテーブル レベルの制約で強制することはできませんが、定義を使用してビューをSELECT Col FROM t WHERE Col IS NOT NULL作成し、その上に一意のクラスター化インデックスを作成することはできます。

于 2011-05-12T18:56:18.853 に答える
0

SQL Server 2008 では、null ではない値に対してフィルター処理されたインデックスを作成できました。残念ながら、これは 2008 リリースの新機能であるため、2005 ではそのようなことはできません。 .

于 2011-05-12T18:55:37.217 に答える
0

いつも私の迷惑です。私は標準の「その他」の解釈を好みます。

SQL Server での null を無視する一意の制約の作成を参照してください。3 つの異なるアプローチについて説明します。

  1. 解決策 1: フィルター処理されたインデックス。

    他の回答から判断すると、これはかなり一般的なようです。私はこのアプローチを試していませんが、 SQL Server 2008が必要です。

  2. 解決策 2: 計算列に対する制約

    私はこれを使用しましたが、うまくいきます。ただし、リレーションシップを調整する必要がある場合や、セカンダリの非一意のカバー インデックスを追加する必要がある場合があります (一意の制約用に 1 つ、インデックス カバー用に 1 つ)。

  3. 解決策 3: UDF チェック制約 (非推奨)

    ああ、TSQL の威力 (読み:に対処すべきこと)。私はこのルートを下っていません。

ハッピーコーディング。

于 2011-05-12T19:01:43.657 に答える