我有以下独特的约束
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 时应用约束
您可以创建一个独特的基于函数的索引
CREATE UNIQUE INDEX idx_dup_active
ON <<table name>>( CASE WHEN is_active = 1
THEN question_no
ELSE NULL
END );
这利用了 Oracle B 树索引不存储叶块数据完全为 NULL 的数据这一事实。
对于多列,您可以使用以下语法创建唯一索引。
创建唯一索引 idx_dup_active ON <>( is_active = 1 时的情况 那么问题_号||IS_ACTIVE 否则为空 结束);