11

这是具有 3 列(ID、UNIQUE_VALUE、UNIQUE_GROUP_ID)的示例表

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

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

或者

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

或(注意:这种情况在nor中是不允许的unique indexunique constraint

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

这些是不允许的:

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

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

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

4

2 回答 2

27

UNIQUE_VALUE您只想对两者UNIQUE_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);
于 2012-10-24T08:54:49.017 回答
-2

您可以使用 nvl 函数来避免空值并改为放置不同的值,

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

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

此外,所有空值都将位于 index 的一个分支下,因此请确保您的直方图已更新。

我希望这能帮到您 :)

于 2012-10-27T19:13:28.073 回答