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

Eri*_*ric 10 sql database oracle indexing

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

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

(1, NULL, NULL)
(2, NULL, NULL)
Run Code Online (Sandbox Code Playgroud)

要么

(3, NULL, 7)
(4, 123, 7)
Run Code Online (Sandbox Code Playgroud)

或(注:此条件中不允许unique index,也没有unique constraint)

(5, NULL, 7)
(6, NULL, 7)
Run Code Online (Sandbox Code Playgroud)

这些是不允许的:

(7, 123, 7)
(8, 123, 7)
Run Code Online (Sandbox Code Playgroud)

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

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

Jef*_*emp 23

你想只执行在哪里都行的唯一性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);
Run Code Online (Sandbox Code Playgroud)