【发布时间】:2009-06-21 23:44:32
【问题描述】:
我有一个要应用唯一约束的 Oracle 数据库表。问题是我只想在该表中的列为空时应用约束,
即。如果一行没有 deleted_date 列,则应用约束,否则忽略它。这将允许软删除记录并忽略对它们的约束。
关于如何做到这一点的任何想法?
干杯, 标记
【问题讨论】:
标签: oracle constraints
我有一个要应用唯一约束的 Oracle 数据库表。问题是我只想在该表中的列为空时应用约束,
即。如果一行没有 deleted_date 列,则应用约束,否则忽略它。这将允许软删除记录并忽略对它们的约束。
关于如何做到这一点的任何想法?
干杯, 标记
【问题讨论】:
标签: oracle constraints
只需创建一个多列约束 - 您希望唯一的列加上删除日期。所有未删除的行都将具有唯一值,并且删除日期为空。由于删除日期,所有删除的行都是唯一的(假设它是一个时间戳并且分辨率足以分隔所有删除)。如果删除的行不能按删除日期分隔,可以考虑创建一个新列并将其添加到约束中以统一删除日期 - 但这是一个非常不雅的解决方案。
【讨论】:
如果分辨率不够好,那么你可以创建一个唯一的基于函数的索引。
一个例子:
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.
这是 Daniel 描述的解决方案。如果有可能同时删除两行(我在这里仅使用日期部分),则此解决方案还不够好:
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.
问候, 抢。
【讨论】: