我有以下唯一约束
dup_Checklist_QNum UNIQUE (QUESTION_NO, IS_ACTIVE)
我试图阻止两个问题在激活时具有相同的问题编号(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
时应用答案 0 :(得分:14)
您可以创建基于函数的唯一索引
CREATE UNIQUE INDEX idx_dup_active
ON <<table name>>( CASE WHEN is_active = 1
THEN question_no
ELSE NULL
END );
这利用了Oracle b-tree索引不存储叶块数据完全为NULL的数据这一事实。