我有以下独特的约束
dup_Checklist_QNum UNIQUE (QUESTION_NO, IS_ACTIVE)
我正在尝试防止两个问题处于 Activity 状态时具有相同的问题编号(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。
关于sql - 基于列值的Oracle唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335899/