我有一张表 - PROGRAM - 其中包括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为null,则PROGRAM_NAME必须是唯一的。
这是否可以在CHECK约束中强制执行?
答案 0 :(得分:3)
您可以使用基于函数的唯一索引定义此类条件唯一约束。
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
行的条目。它还避免了组合字符串产生的结果字符串太长或者第一个字符串的后缀也是另一个字符串的前缀的可能性。