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
行的条目。它还避免了组合字符串产生太长的结果字符串或第一个字符串的后缀也是另一个字符串的前缀的可能性。
我有一个 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
行的条目。它还避免了组合字符串产生太长的结果字符串或第一个字符串的后缀也是另一个字符串的前缀的可能性。