以下是包含3列的示例表(ID,UNIQUE_VALUE,UNIQUE_GROUP_ID)
我希望以下记录可以被允许:
(1, NULL, NULL)
(2, NULL, NULL)
或
(3, NULL, 7)
(4, 123, 7)
或(注意:unique index
或unique constraint
不允许这种情况发生)
(5, NULL, 7)
(6, NULL, 7)
并且不允许这些:
(7, 123, 7)
(8, 123, 7)
我在最后2列创建了一个唯一索引,但只允许前两个示例。
只有当两个列都不为空时,是否可以让db检查这两列的唯一性?
答案 0 :(得分:21)
您希望仅对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);
答案 1 :(得分:-2)
你可以使用nvl函数来避免空值,而是放置一个不同的值,
create unique index func_idx on TEST_TABLE (nvl(UNIQUE_VALUE,1), UNIQUE_GROUP_ID);
缺点是您的索引会更大,如果您想搜索空值,则必须使用nvl函数以避免使用table_access_full。
所有空值都将位于索引中的一个分支下,因此请确保更新直方图。
我希望这会对你有所帮助:)。