11

これは、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列に一意のインデックスを作成しましたが、許可できるのは最初の2つの例のみです。

両方がnullでない場合にのみ、dbにこれら2つの列の一意性をチェックさせることは可能ですか?

4

2 に答える 2

27

UNIQUE_VALUEUNIQUE_GROUP_IDがnullでない行にのみ一意性を適用する必要があります。これを行うには、一意の関数ベースのインデックスを使用できます。

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関数を使用して、nullを回避し、代わりに別の値を配置できます。

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

欠点は、インデックスが大きくなることです。null値を検索する場合は、table_access_fullを回避するためにnvl関数を使用する必要があります。

また、すべてのnull値は、インデックスの1つのブランチの下に配置されるため、ヒストグラムが更新されていることを確認してください。

これがお役に立てば幸いです:)

于 2012-10-27T19:13:28.073 に答える