主キーとして
その一意が主キーである場合は、これを実行します:
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