如何在具有可能空值的字段上创建唯一索引(Oracle 11g)?

时间:2012-10-24 04:22:13

标签: sql database oracle indexing

以下是包含3列的示例表(ID,UNIQUE_VALUE,UNIQUE_GROUP_ID)

我希望以下记录可以被允许:

(1, NULL, NULL)
(2, NULL, NULL)

(3, NULL, 7)
(4, 123, 7)

或(注意:unique indexunique constraint 不允许这种情况发生)

(5, NULL, 7)
(6, NULL, 7)

并且不允许这些:

(7, 123, 7)
(8, 123, 7)

我在最后2列创建了一个唯一索引,但只允许前两个示例。

只有当两个列都不为空时,是否可以让db检查这两列的唯一性?

2 个答案:

答案 0 :(得分:21)

您希望仅对UNIQUE_VALUEUNIQUE_GROUP_ID都不为空的行强制实施唯一性。为此,您可以使用基于函数的唯一索引:

CREATE UNIQUE INDEX func_based_index ON the_table
  (CASE WHEN unique_value IS NOT NULL
         AND unique_group_id IS NOT NULL
        THEN UNIQUE_VALUE || ',' || UNIQUE_GROUP_ID
   END);

答案 1 :(得分:-2)

你可以使用nvl函数来避免空值,而是放置一个不同的值,

create unique index func_idx on TEST_TABLE (nvl(UNIQUE_VALUE,1), UNIQUE_GROUP_ID);

缺点是您的索引会更大,如果您想搜索空值,则必须使用nvl函数以避免使用table_access_full。

所有空值都将位于索引中的一个分支下,因此请确保更新直方图。

我希望这会对你有所帮助:)。

相关问题