ORACLE - CHECK 约束强制条件唯一性

ORACLE - CHECK constraint enforcing conditional uniqueness

我有一个 table - 程序 - 其中包括列 PROGRAM_NAME 和 PROGRAM_NUMBER。

PROGRAM_NUMBER 已经是唯一的。

CREATE UNIQUE INDEX UNIQUE_PROG_NUMBER on PROGRAM(upper(PROGRAM_NUMBER));

还有一个约束,以确保始终填充 PROGRAM_NAME 或 PROGRAM_NUMBER。

ALTER TABLE PROGRAM ADD CONSTRAINT NAME_OR_NUMBER_NOT_NULL
CHECK (PROGRAM_NAME IS NOT NULL OR PROGRAM_NUMBER IS NOT NULL) ENABLE;

现在已经通过了一项要求,以确保, 如果 PROGRAM_NUMBER 为空,则 PROGRAM_NAME 必须是唯一的。

是否可以在 CHECK 约束中强制执行?

您可以使用基于函数的唯一索引来定义这种条件唯一约束。

CREATE UNIQUE INDEX idx_unique_program_name
    ON program( CASE WHEN program_number IS NULL
                     THEN program_name
                     ELSE NULL
                  END );

这利用了 Oracle 不索引 NULL 值这一事实,因此创建的索引仅包含 program_number IS NULL 行的条目。它还避免了组合字符串产生太长的结果字符串或第一个字符串的后缀也是另一个字符串的前缀的可能性。