检查值是否仅在列中出现一次

时间:2014-08-18 11:56:52

标签: sql oracle constraints unique

我想创建一个用于管理参数版本的表...

在此表中有一个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上的检查约束是否正确?

1 个答案:

答案 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时,则使用常量,因此两个值将发生冲突。