基于列值的Oracle唯一约束

6

我有以下唯一约束条件

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.1、0.2、0.3等来停用问题...只要我的应用程序只在值为1时关心,并忽略所有其他问题。 - jeff
2
可能是Oracle数据库中的条件唯一约束的重复问题。 - Justin Cave
1个回答

18

你可以创建一个唯一的基于函数的索引。

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

这利用了Oracle b-tree索引不会存储叶块数据完全为NULL的事实。


1
我想知道Oracle何时会通过允许在CREATE INDEX中使用WHERE子句来提供更少笨拙的部分索引。 - user330315
我有一个类似的案例,但唯一约束需要在两列上,我正在努力理解语法。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接