【问题标题】:Oracle unique constraint with where clause带有 where 子句的 Oracle 唯一约束
【发布时间】:2009-06-21 23:44:32
【问题描述】:

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

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

关于如何做到这一点的任何想法?

干杯, 标记

【问题讨论】:

    标签: oracle constraints


    【解决方案1】:

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

    【讨论】:

    • 伙计,我在想这个!谢谢,我认为这样就可以了
    【解决方案2】:

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

    一个例子:

    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.
    

    问候, 抢。

    【讨论】:

    • +1:基于唯一函数的索引可能比当前接受的答案更好
    • 如果必须在两列上创建索引怎么办? nvl2(deleted_date,null,'col1,col2')?
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2014-02-24
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多