2012-04-25 18 views
16

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

したがって、たとえば、私はテーブルのようなテーブルを持っている(ID、EID、名前、ISDeleted)

ISDeletedは(アクティブまたは削除)がnull値または「Y」を持つことができる、と私は作成したいですEIDのユニーク制約、ISDeleted = nullの場合のみISDeleted、同じIDを持つ複数の削除されたレコードがある場合は気にしないためです。 EIDはnull値を持つことができます。

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

答えて

22

制約を作成することはできません。しかし、独自の関数ベースの索引を作成できます。これは、OracleがNULL値を索引付けしないという利点を利用します。isDeletedNOT NULLの行は索引には含まれないため、一意制約は適用されません。

CREATE UNIQUE INDEX one_not_deleted 
    ON table_name((CASE WHEN isDeleted IS NULL 
         THEN eid 
         ELSE null 
         END)); 
+0

「その他のnull」とは何ですか? null値を挿入するか、レコードの重複挿入を許可しますか? – D3V

+0

@SantoshPingale - OracleインデックスはNULL値をインデックス付けしないので、ELSE NULLは重複を許可するインデックスからそれらの行を除外します。 –