Oracle中的约束取决于字段的值

时间:2014-07-24 08:00:21

标签: sql oracle oracle11g

想象一下,我在Oracle数据库中有一个包含3列的表,ID(PK),NAMEACTIVE。例如,如果我希望将NAMEACTIVE放在一起,我可以轻松地做到这一点。但是,我想要的是NAME只有当该行中的ACTIVE设置为true(1)时才是唯一的。当ACTIVE为false(0)时,我希望能够拥有相同数量的行NAME(但当然不同ID)。这可能吗?

2 个答案:

答案 0 :(得分:5)

是的,在Oracle中,您可以创建一个带有CASE语句的唯一索引,在您的情况下可以这样;

CREATE UNIQUE INDEX ix_uq ON test(
  name, 
  CASE WHEN active = 0 THEN id ELSE 0 END
)

由于id是唯一的,只要active = 0,我们就可以有多个同名的行(因为唯一性将基于(name,id)),而一个活动的条目将检查唯一性(name, 0)每个名称只允许一个活动行。

An SQLfiddle to test with。尝试添加重复的活动条目,但不会插入。

答案 1 :(得分:4)

这是另一种可能性。

CREATE UNIQUE INDEX ix_uq ON test(decode(active,1,name,null))

这样,您的索引可能是最小的,因为您不需要索引非活动值。如果你的桌子开始非常大,并且有很小的活跃值,那么它就会很有用。