带有where子句的Oracle唯一约束

带有where子句的Oracle唯一约束,oracle,constraints,Oracle,Constraints,我有一个Oracle数据库表,希望对其应用唯一约束。问题是,我只想在该表中的列为null时应用约束 即,如果一行没有“已删除日期”列,则应用约束,否则忽略它。这将允许软删除记录并忽略对它们的约束 你有什么想法吗 干杯, 标记只需创建一个多列约束-要唯一的列加上删除日期。所有未删除的行将具有唯一值,且删除日期为空。由于删除日期的原因,所有删除的行都将是唯一的(假设它是一个时间戳,并且分辨率足以分隔所有删除)。如果删除的行不能用删除日期分隔,可以考虑创建一个新列并将其添加到约束中,以统一删除日期,但

我有一个Oracle数据库表,希望对其应用唯一约束。问题是,我只想在该表中的列为null时应用约束

即,如果一行没有“已删除日期”列,则应用约束,否则忽略它。这将允许软删除记录并忽略对它们的约束

你有什么想法吗

干杯,
标记

只需创建一个多列约束-要唯一的列加上删除日期。所有未删除的行将具有唯一值,且删除日期为空。由于删除日期的原因,所有删除的行都将是唯一的(假设它是一个时间戳,并且分辨率足以分隔所有删除)。如果删除的行不能用删除日期分隔,可以考虑创建一个新列并将其添加到约束中,以统一删除日期,但这将是一个非常不雅观的解决方案。

如果分辨率不够好,则可以创建一个唯一的基于函数的索引

例如:

SQL> create table t (id,col,deleted_date)
  2  as
  3  select 1, 99, null from dual union all
  4  select 2, 99, date '2009-06-22' from dual
  5  /

Tabel is aangemaakt.

SQL> alter table t add constraint t_pk primary key (id)
  2  /

Tabel is gewijzigd.

SQL> alter table t add constraint t_uk1 unique (col,deleted_date)
  2  /

Tabel is gewijzigd.
这是丹尼尔描述的解决方案。如果有可能同时删除两行(我在这里仅使用日期部分),此解决方案不够好:

SQL> insert into t values (3, 99, date '2009-06-22')
  2  /
insert into t values (3, 99, date '2009-06-22')
*
FOUT in regel 1:
.ORA-00001: unique constraint (RWK.T_UK1) violated
在这种情况下,请使用唯一的基于函数的索引:

SQL> alter table t drop constraint t_uk1
  2  /

Tabel is gewijzigd.

SQL> create unique index i1 on t (nvl2(deleted_date,null,col))
  2  /

Index is aangemaakt.

SQL> insert into t values (3, 99, date '2009-06-22')
  2  /

1 rij is aangemaakt.
问候,,
罗布。

老兄,我正想把这件事想得太多了!谢谢,那就好了,我想+1:基于唯一函数的索引可能比目前公认的答案要好。如果索引必须在两列上创建呢?nvl2(删除日期,空,'col1,col2')?