只有一行可以是 'Yes' 的唯一约束(但基于其他列中的值)

Unique constraint where only one row can be 'Yes' (but based on values in other columns)

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

规则是每个系统[=27]中每个类型只能有一个active标志=].

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

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

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

看起来这应该是可行的,但我不确定如何解决这个问题。

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

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

我找到了解决方案!

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