18

別の列の値に応じて、列 [属性] に一意の制約を適用する必要がある状況があります。

たとえば、私は Table(ID, EID, Name, ISDeleted) のようなテーブルを持っています

ISDeleted は null または 'y' (アクティブまたは削除済み) の値のみを持つことができます。同じ ID を持つ複数の削除されたレコードがあるかどうかは気にしないため、ISDeleted = null の場合にのみ、EID に一意の制約を作成したいと考えています。EID は null 値を持つことができることに注意してください。

これにはOracle DBを使用しています。

4

1 に答える 1

28

制約を作成することはできません。ただし、一意の関数ベースのインデックスを作成できます。これは、Oracle が NULL 値のインデックスを作成しないという事実を利用しています。NULL 値の行はisDeletedインデックスNOT NULLに含まれないため、一意の制約は適用されません。

CREATE UNIQUE INDEX one_not_deleted
    ON table_name( (CASE WHEN isDeleted IS NULL
                         THEN eid
                         ELSE null
                      END) );
于 2012-04-25T14:29:17.790 に答える