6

私は次のユニークな制約があります

dup_Checklist_QNum UNIQUE (QUESTION_NO, IS_ACTIVE)

アクティブなときに同じ質問番号を持つ2つの質問を防止しようとしています(IS_ACTIVE値= 1)。

もう一度質問を修正しなければならないまでは、すべて問題ないようでした。

QUESTION_NO=1, TEXT="Have you..", REV=1, IS_ACTIVE=0  
QUESTION_NO=1, TEXT="Have you..", REV=2, IS_ACTIVE=0  <-- This should be ok but constraint was violated
QUESTION_NO=1, TEXT="Have you..", REV=3, IS_ACTIVE=1
QUESTION_NO=1, TEXT="Have you..", REV=3, IS_ACTIVE=1 <-- This should be throw constraint exception 

IS_ACTIVE=1の場合にのみ適用する制約が必要です

4

1 に答える 1

16

独自の関数ベースのインデックスを作成できます

CREATE UNIQUE INDEX idx_dup_active
    ON <<table name>>( CASE WHEN is_active = 1
                            THEN question_no
                            ELSE NULL
                        END );

これは、Oracle b-treeインデックスが、リーフブロックデータが完全にNULLになるデータを格納しないという事実を利用しています。

于 2012-07-04T22:17:56.097 に答える