只有一行可以是 '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;
我有一个用于存储徽标图像的数据库。可以有几种不同类型的徽标图像。还有多个系统将这些标识相互隔离。
规则是每个系统[=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;