【问题标题】:Oracle Unique Constraint based on column valueOracle 基于列值的唯一约束
【发布时间】:2018-07-26 19:06:10
【问题描述】:

我有以下唯一约束

dup_Checklist_QNum UNIQUE (QUESTION_NO, IS_ACTIVE)

我试图防止两个问题在处于活动状态时具有相同的问题编号(IS_ACTIVE 值 = 1)。

在我不得不第二次修改问题之前,一切似乎都很好。

QUESTION_NO=1, TEXT="Have you..", REV=1, IS_ACTIVE=0  
QUESTION_NO=1, TEXT="Have you..", REV=2, IS_ACTIVE=0  <-- This should be ok but constraint was violated
QUESTION_NO=1, TEXT="Have you..", REV=3, IS_ACTIVE=1
QUESTION_NO=1, TEXT="Have you..", REV=3, IS_ACTIVE=1 <-- This should be throw constraint exception 

我需要仅在 IS_ACTIVE=1 时应用约束

【问题讨论】:

  • 我想作为一种变通方法,我可以通过使用唯一数字 0.1、0.2、0.3 等来停用问题...前提是我的应用程序只关心值为 1 时,并忽略所有其他问题。

标签: sql oracle constraints


【解决方案1】:

您可以创建唯一的基于函数的索引

CREATE UNIQUE INDEX idx_dup_active
    ON <<table name>>( CASE WHEN is_active = 1
                            THEN question_no
                            ELSE NULL
                        END );

这利用了 Oracle b-tree 索引不存储叶块数据完全为 NULL 的数据这一事实。

【讨论】:

  • 我想知道 Oracle 何时通过允许 CREATE INDEX 的 WHERE 子句最终为我们提供不那么笨拙的部分索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多