SQL Server 2005のNullable列の一意の制約


12

私が取り組んでいるこの1つのプロジェクトでは、特定のフィールドを一意に設定する必要があります(問題ではありません!)が、フィールドがnullの場合、制約を無視する必要があります。Sql Server 2008では、以下に示すようにフィルター選択されたインデックスを使用しますが、これは以前のバージョンのSQLでは使用できません!

CREATE UNIQUE NONCLUSTERED INDEX User_UserName_IUC
ON [User] (pinNr)
WHERE UserName IS NOT NULL

しかし、これはSQL Server 2005で利用できるとは思いません。実際、このブログ投稿では、トリガーを使用して一意性を確認する回避策があることを示しています。誰もこれの例を持っていますか?または多分代替案?

残念ながら、SQl Server 2008へのアップグレードは、この特定のクライアントのオプションではありません!!

回答:


18

実際、私は一度このようなことをしなければなりませんでした。一意でない列NULLの値と主キーの値を取得する計算列を作成し(一意の列の値と衝突することを不可能にする他のロジックを使用)、一意のインデックスを作成するその列。この例とトリガーメソッドはこちらで確認できます


7

ビューを作成して(ユーザー名がnullでない場合)、ビューに対して一意のインデックスを付けることができます。ビューを使用する必要はありません。このためにのみ存在します。

この手法を使用して、通常は不可能な複数のテーブルに一意性を適用することもできます。


2
インデックス付きビューにはエンタープライズ版は必要ありません。ただし、WITH(NOEXPAND)クエリヒントを使用して、標準エディションのクエリオプティマイザーが基になるクエリの代わりにインデックス付きビューを使用するように強制する必要があります。
エレミヤペシュカ

3
この場合、ビューの唯一のポイントは一意の制約を適用することであり、これは完全に有効/一般的なアプローチです。
マーティンスミス

2
必要なEnterprise Editionに関する誤った情報を削除するように編集されました。
メフ

@Meff、ここのコメントに回答してくれてありがとう-サイトを
知ら
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.