【问题标题】:ORACLE - CHECK constraint enforcing conditional uniquenessORACLE - CHECK 强制执行条件唯一性的约束
【发布时间】:2015-03-06 12:44:27
【问题描述】:

我有一个表 - 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 为空,则 PROGRAM_NAME 必须是唯一的。

这可以在 CHECK 约束中强制执行吗?

【问题讨论】:

    标签: database oracle constraints unique-constraint


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2014-06-20
      • 2012-07-21
      • 1970-01-01
      • 2012-05-06
      • 2018-09-11
      相关资源
      最近更新 更多