6

私はテーブルを持っています

FieldsOnForms(
 FieldID int (FK_Fields)
 FormID int (FK_Forms)
 isDeleted bit
)

ペア(FieldID、FormID)は一意である必要がありますが、行が削除されていない場合(isDeleted = 0)のみです。

SQLServer 2008でそのような制約を定義することは可能ですか?(トリガーを使用せずに)

PS設定(FieldID、FormID、isDeleted)を一意にすると、1つの行を削除済みとしてマークする可能性が追加されますが、n行(FieldID、FormIDごと)をisDeleted = 1に設定し、1つだけにする機会が欲しいです。 isDeleted=0の場合

4

3 に答える 3

13

SQL Server 2008 のフィルター処理されたインデックス機能を使用して一意のインデックスを作成するか、ビューに対して UNIQUE インデックスを適用できます (貧弱なフィルター処理されたインデックスは、以前のバージョンに対して機能します)。ただし、UNIQUE 制約を使用することはできません。説明された。

フィルタリングされたインデックスの例:

 CREATE UNIQUE NONCLUSTERED INDEX IX_FieldsOnForms_NonDeletedUnique ON FieldsOnForms (FieldID,FormID) WHERE isDeleted=0
于 2010-10-22T14:39:10.913 に答える
4

IsDeleted列をDeletedDateに変更し、行が論理的に削除された正確な時刻を含むDATETIMEにすることができます。または、DeletedDate列を追加し、それに対してIsDeleted計算列を作成して、コードで使用されている場合でもその列を使用できるようにすることもできます。もちろん、IsDeleted列ではなく、(FieldIDとFormIdに加えて)DeletedDateに一意のインデックスを設定します。これにより、NULL列が1つだけ許可されます。

Albinはこれに似た解決策を投稿しましたが、その後削除しました。理由はわかりませんが、彼がそれを再投稿した場合、彼は私の前にここにいました。:)

于 2010-10-22T14:44:57.803 に答える
0

いいえ、ユニークとは本当にユニークという意味です。削除されたレコードを別のテーブルに移動するか、IsDeleted をすべての削除されたレコードで一意になるもの (タイム スタンプなど) に変更する必要があります。どちらのソリューションでも、アプリケーション、ストアド プロシージャ、またはトリガーで追加の作業が必要になります。

于 2010-10-22T14:41:04.793 に答える