【问题标题】:Unique constraint where only one row can be 'Yes' (but based on values in other columns)只有一行可以是“是”的唯一约束(但基于其他列中的值)
【发布时间】:2021-09-30 02:34:38
【问题描述】:

我有一个用于存储徽标图像的数据库。可以有几种不同类型的徽标图像。还有多个系统将这些徽标相互隔离。

规则是每个系统中的每个类型只能有一个active标志。

我正在尝试对此进行限制。这是我现在拥有的:

alter table logo_t
add constraint logo_active_uk
unique (
  SystemId,
  LogoType,
  Active
) using index tablespace t_indexes;

这很接近,但问题是它只允许一个徽标在任何时候不活动。所以基本上,我需要忽略约束中的任何非活动徽标(active = 'No')。

这似乎应该是可能的,但我不确定如何解决这个问题。

【问题讨论】:

  • 在 SQL Server 中,我会使用过滤的唯一索引。 stackoverflow.com/q/5939776/121544 是关于 Oracle 的 SO 问题,相当于过滤索引。也许你可以适应过滤后的独特。

标签: oracle unique-constraint


【解决方案1】:

我找到了解决办法!

create unique index logo_active_uk
on logo_t(
  (case when Active = 'Yes' then SystemId || LogoType || Active else null end)
) tablespace t_indexes;

【讨论】:

    【解决方案2】:

    我认为如果有任何列存储非活动日期/时间,只需在脚本中添加该列即可。这将使您的所有记录独一无二,并解决您的目的。因此,只需将您的脚本更新为 -

    alter table logo_t
    add constraint logo_active_uk
    unique (
      SystemId,
      LogoType,
      Active,
      <Your_time/timestamp_column> 
    ) using index tablespace t_indexes;
    

    【讨论】:

    • 不幸的是,我没有任何其他列(例如时间戳)来使行独一无二。不过,这是一个非常聪明的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多