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

har*_*oba 3 sql oracle oracle11g

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

Joa*_*son 5

是的,在Oracle中,您可以使用CASE语句创建一个唯一索引,在您的情况下,类似于;

CREATE UNIQUE INDEX ix_uq ON test(
  name, 
  CASE WHEN active = 0 THEN id ELSE 0 END
)
Run Code Online (Sandbox Code Playgroud)

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

一个要测试的SQLfiddle.尝试添加重复的活动条目,但不会插入.