我想创建一个用于管理参数版本的表...
在此表中有一个char
类型的列,让我知道我必须使用的版本:
create table PARAMETERS_VERSION (
ID number not null,
VERSION number not null,
DATE_START date not null,
DATE_END date check(DATE_START <= DATE_END) not null
ISUSED char(1) check(ISUSED in ('Y','N')) not null,
constraint PARAMETERS_VERSION_VERSION_PK primary key (ID),
constraint PARAMETERS_VERSION_VERSION_UK unique (ISUSED)
);
如何在列ISUSED
上定义唯一约束,使其只有一行,其值为&#39; Y
&#39; (以及其他人使用&#39; N
&#39;)?
顺便说一句,DATE_END
上的检查约束是否正确?
答案 0 :(得分:3)
Oracle不太支持部分或过滤索引。相反,您可以使用具有一些聪明的功能索引:
create unique index idx_parametersversion_isused
on parameters_version(case when is_used = 'Y' then -1 else id end);
也就是说,当is_used
具有除Y
以外的任何值时,则使用主键。当它是Y
时,则使用常量,因此两个值将发生冲突。