PostgreSQLテーブルを作成した後で、そのテーブルにUNIQUE制約を追加できますか?


185

次の表があります。

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

特定のtickername/ tickerbbnameペアに対して複数の列が存在することは望ましくありません。テーブルを既に作成しており、そこに大量のデータが含まれています(これは、一意の基準を満たしていることを既に確認しています)。しかし、それが大きくなるにつれて、エラーの余地が入り込みます。

UNIQUEこの時点で制約を追加する方法はありますか?


回答:


363

psqlのインラインヘルプ:

\h ALTER TABLE

また、postgres docsにも文書化されています(優れたリソースに加え、読みやすい)。

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

6
@hhaamuに感謝します。うんドキュメントを試しましたが、あなたの上記ははるかに簡潔です。
トーマスブラウン

117
PostgreSQLにインデックス名を生成させたい場合は、を使用してくださいALTER TABLE tablename ADD UNIQUE (columns);。(CONSTRAINTキーワードは省略しなければならないことに注意してください。)
jpmc26 '26

5
私はまさにこの質問への答えを必要としていて、ドキュメントを探し始めました。Postgresのドキュメントの代わりに、StackOverflowでこのトピックに遭遇しました。したがって、公式ドキュメントを参照することは良い考えですが、将来の訪問のために答えを出すことも非常に良いことです。有難うございます。
Leonard

@ jpmc26«PostgreSQLにインデックス名を生成させたい場合»制約名ですか?
tuxayo 2017

4
@tuxayo、一意の制約はPostgresのインデックスを介して実装されます(ペダンティックではありません)。
クリスW.

36

はい、できます。ただし、テーブルに一意でないエントリがある場合、失敗します。テーブルに一意性制約を追加する方法は次のとおりです。PostgreSQL 9.xを使用している場合は、以下の手順に従ってください。

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

3
ありがとうZeck-2年後のいい答えですが、人々がまだ時間をかけてくれていることに感謝しています!トム
トーマスブラウン2011

1
不正解です。最新のPostgresでは、一意ではない値がある場合、「Key(uuid)=(3a533772-07ac-4e76-b577-27a3878e2222)is duplicated。Query failed」のようなメッセージも表示されます...
Strinder

3
@Strinder、どうしてそんなに良くないの?最初に重複データを修正してください。
Jasen

3
@Jasenそれは完全に明らかです。「テーブルに一意でないエントリがある場合、テーブルに一意制約を追加する方法は次のとおりです。」という答えを強調したかっただけです。動作しないでしょう。もちろん、一意でないエントリは常に事前に統合する必要があります。
Strinder、

明確にするために回答を編集
Xavier Ho

6

名前と姓に基づく既存の制約がすでにあるテーブルがあり、さらに1つの一意の制約を追加したい場合は、次の方法で制約全体を削除する必要がありました。

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

追加する新しい制約が、そのテーブルのすべてのデータにわたって一意/ nullではない(Microsoft SQLの場合は、null値を1つしか含めることができない)ことを確認してから、それを再作成できます。

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

5

はい、事実の後にUNIQUE制約を追加できます。ただし、テーブルに一意でないエントリがある場合、修正するまでPostgresはそれについて不平を言います。


7
select <column> from <table> group by 1 having count(*) > 1;重複した値に関するレポートを提供します。
Jasen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.