Postgresqlでは、2つの列の組み合わせで一意に強制します


192

2つの列が一意になるように、PostgreSQLでテーブルを設定したいと思います。両方を共有する2つの値がない限り、どちらかの値の複数の値が存在する可能性があります。

例えば:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

だから、col1col2ではなく、同時に、繰り返すことができます。したがって、これは許可されます(IDは含まれません)

1 1
1 2
2 1
2 2

これではありません:

1 1
1 2
1 1 -- would reject this insert for violating constraints

これはグーグルのトップランクの検索結果であるとして、多分、より良いすぎて、ALTERが存在テーブルを提供するために
ϻαϻɾΣɀО-MaMrEzO

回答:


228
CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)

autoincrementpostgresqlではありません。あなたが欲しいserial

col1とcol2が一意になり、nullにできない場合、これらは適切な主キーになります。

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)

6
この場合、NULL値は許可されないため、ここでは一意よりも主キーを提案するのが好きです。PostgeSQLのドキュメントから:「null値は除外されないため、一意制約はそれ自体では一意の識別子を提供しないことに注意してください。」postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker

これをスキーマ定義に実装するにはどうすればよいですか?
2018年

2
一部のシナリオでは、列の組み合わせではなく、代理キーを主キーとして使用したい場合があります。特に、ビッグデータボリュームで結合を行うときのパフォーマンスを向上させるため。私は個人的に以下のUNIQUE CONSTRAINTソリューションを選びました。
Alexis.Rolland

1
unique(col1、col2 = '1')のように、1つの順列のみに一意制約を適用することは可能ですか?
Vikram Khemlani


160

2つの数値を一緒に繰り返すことはできないという一意の制約を作成します。

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

18

通常のユニークな制約のようです:)

CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c));

詳細はこちら


1
これはのインデックスaとのインデックスをc個別に追加しますか?a時々に基づいてすばやく見つけたり、時々に基づいてすばやく見つけたりする必要があるためcです。
CMCDragonkai
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.