sql >> データベース >  >> RDS >> PostgreSQL

一意性を強化するために複数列のインデックスを作成する

    これは誤解のようです。

    私の回答からの引用は、あちらで説明されているように追加の部分インデックスも作成した場合にのみ適用されるため、少し誤解を招く可能性があります。
    PostgreSQLに条件付き一意インデックスを追加する方法

    この2番目のインデックスを追加しない場合(追加しなかった場合と同様)、すでにソリューションがあります 、 そうらしい。複数列の一意のインデックスのみを使用して、(1, NULL)を入力できます 複数回、ただし(1,2) または(1,3) 一度だけ。

    空の文字列

    誤って空の文字列を検討していた場合('' )(文字タイプ の場合 )NULLの代わりに 値:これらは他の値と同じように処理されます。あなたはできた 複数列の部分的に機能する一意のインデックスを使用してこの状況に対処します (式のインデックス ):

    CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
    ON predictions (tat, NULLIF(dim, ''));
    

    このようにして、(1, 'a')を入力できます。 、(1, 'b') 一度だけ。
    しかし(1, NULL) および(1, '') 複数回。

    副作用

    インデックスは、最初の列(tat)でのプレーンクエリを引き続き完全にサポートします。 )。
    ただし、両方の列のクエリは、可能性を最大限に活用するために式と一致する必要があります。意味がないように見えても、これはより高速です:

    SELECT * FROM predictions
    WHERE  tat = 1
    AND    NULLIF(dim, '') = 'foo';
    

    ..これより:

    SELECT * FROM predictions
    WHERE  tat = 1
    AND    dim = 'foo';
    

    ..最初のクエリは両方のインデックス列を使用できるためです。結果は同じになります(''を検索する場合を除く) またはNULL )。 dba.SEのこの関連する回答の詳細




    1. MySQLデータベースを別のマシンにコピーする

    2. FIFO/キューとしてのMySQLテーブル

    3. ユーザーメッセージングシステム

    4. mysql:複数のタグと同じIDを持つ行を検索する