UNIQUE 约束将多列与一个条件组合在一起

use*_*625 2 sql oracle oracle11g

我在 Oracle 11g 中有一个表,例如下面的列。

  • COL1_STATUS
  • COL2_ID
  • COL3_TYPE
  • COL4_DATE

我想创建一个结合所有 4 列的 UNIQUE 约束,但仅当 COL1_STATUS = 10

我怎样才能做到这一点?表已经创建,所以我只寻找 ALTER 命令。

另外,我搜索并发现了类似的问题,建议使用唯一索引,但我想通过约束来实现这一点。

oracle db中具有多个字段的条件唯一约束

提前致谢。

Gor*_*off 6

唯一索引和约束本质上是一回事。唯一约束是使用唯一索引实现的。所以这真的应该做你想做的:

create unique index idx_table_4 on
    table(case when status = 10 then id end,
          case when status = 10 then type end,
          case when status = 10 then date end);
Run Code Online (Sandbox Code Playgroud)

事实上,这就是文档建议实施唯一约束的方式:

当您在一个或多个列上指定唯一约束时,Oracle 会隐式地在唯一键上创建一个索引。如果您为了查询性能而定义唯一性,那么 Oracle 建议您改为使用 CREATE UNIQUE INDEX 语句显式创建唯一索引。您还可以使用 CREATE UNIQUE INDEX 语句创建一个基于唯一函数的索引,该索引定义了一个条件唯一约束。有关更多信息,请参阅“使用基于函数的索引来定义条件唯一性:示例”。