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

結合テーブルのPostgres固有の複数列インデックス

    主キーとして

    その一意が主キーである場合は、これを実行します:

    create table tbl(
       a_id int not null,
       b_id int not null,
       constraint tbl_pkey primary key(a_id,b_id)
    );
    

    主キーではありません

    その一意が非主キーである場合は、これを実行します:

    create table tbl(
    
       -- other primary key here, e.g.:
       -- id serial primary key,
    
       a_id int not null,
       b_id int not null,
       constraint tbl_unique unique(a_id,b_id)
    );
    

    既存のテーブル

    既存のテーブルがある場合は、代わりにこれを行ってください:

    alter table tbl
          add constraint tbl_unique unique(a_id, b_id)
    

    その変更テーブルには、次のメッセージが表示されます:

    NOTICE:  ALTER TABLE / ADD UNIQUE will create implicit index "tbl_unique" for table "tbl"
    
    
    Query returned successfully with no result in 22 ms.
    

    ドロップ

    その制約を削除したい場合(3つのフィールドの組み合わせを一意にしたい場合があります):

    ALTER TABLE tbl DROP CONSTRAINT tbl_unique;
    

    インデックスと制約とヌル

    インデックスに関しては、Postgres docから:

    出典: http://www.postgresql.org/docs/9.1 /static/indexes-unique.html

    一意性がいくつかのルールに依存する場合は、CREATE UNIQUE INDEXを使用する必要があります 、例:

    これを考えると:

    CREATE TABLE tbl
    (
      a_id integer NOT NULL,
      b_id integer NULL  
    );
    
    alter table tbl
        add constraint tbl_unique unique(a_id, b_id);
    

    その一意のものはこれらの重複をキャッチできます。これはデータベースによって拒否されます:

    insert into tbl values
    (1,1),
    (1,1);
    

    しかし、そのUNIQUECONSTRAINTは重複するnullをキャッチできません。ヌルは不明として機能し、ワイルドカードとして機能します。そのため、一意の制約で複数のヌルを使用できます。これはデータベースによって受け入れられます:

    insert into tbl values
    (1,1),
    (1,null), -- think of this null as wildcard, some real value can be assigned later.
    (1,null); -- and so is this. that's why both of these nulls are allowed
    

    UNIQUE CONSTRAINTについて考えてみてください 延期された一意性を許可するため、上記のnull値を受け入れることができます。

    一意性制約を除いて、a_idごとに1つのワイルドカード(null b_id)のみが必要な場合は、UNIQUE INDEXを追加する必要があります。 。 UNIQUECONSTRAINTはそれらに表現を付けることはできません。 INDEX およびUNIQUE INDEX できる。これは、複数のnullを拒否するための完全なDDLになります;

    これが完全なDDLになります:

    CREATE TABLE tbl
    (
      a_id integer NOT NULL,
      b_id integer NULL  
    );
    alter table tbl
        add constraint tbl_unique unique(a_id, b_id);
    
    create unique index tbl_unique_a_id on tbl(a_id) where b_id is null;      
    

    これはデータベースによって拒否されます:

    insert into tbl values
    (1,1),
    (1,null),
    (1,null);
    

    これは許可されます:

    insert into tbl values
    (1,1),
    (1,null);
    

    http://www.ienablemuch .com / 2010/12 / postgresql-said-sql-server2008-said-non.html



    1. IRIWorkbenchでのテーブルフィルタリング

    2. UTL_FILE.FOPEN()プロシージャがディレクトリのパスを受け入れていませんか?

    3. はじめにAzureSQLデータベースでのパフォーマンスの調整

    4. 列が存在しないことを訴えるPostgreSQLのcurrval関数