概要:このチュートリアルでは、列または列のグループに格納されている値がテーブル内の行全体で一意であることを確認するためのPostgreSQLUNIQUE
制約につ
場合によっては、列または列のグループに格納されている値が、電子メールアドレスやユーザー名など、テーブル全体で一意であることを確認したい場合があ
PostgreSQLは、データの一意性を正しく維持するUNIQUE
制約を提供します。
UNIQUE
制約が設定されている場合、新しい行を挿入するたびに、値がすでにテーブルにあるかどうかがチェックされます。 値が既に存在する場合は、変更を拒否し、エラーを発行します。 既存のデータを更新するために同じプロセスが実行されます。
列または列のグループにUNIQUE
制約を追加すると、PostgreSQLは自動的に列または列のグループに一意のインデックスを作成します。
PostgreSQL UNIQUE制約の例
次の文は、person
という名前の新しいテーブルを作成し、email
列にUNIQUE
制約を付けます。
Code language: SQL (Structured Query Language) (sql)
上記のUNIQUE
制約は、次のクエリに示すようにテーブル制約として書き換えることができます:
Code language: SQL (Structured Query Language) (sql)
最初に、INSERT
ステートメントを使用してperson
テーブルに新しい行を挿入します:
Code language: SQL (Structured Query Language) (sql)
次に、重複した電子メールを含む別の行を挿入します。
Code language: SQL (Structured Query Language) (sql)
PostgreSQLがエラーメッセージを発行しました。
Code language: SQL (Structured Query Language) (sql)
複数の列に一意制約を作成する
PostgreSQLを使用すると、次の構文を使用して列のグループにUNIQUE
制約を作成できます:
Code language: SQL (Structured Query Language) (sql)
列c2とc3の値の組み合わせは、テーブル全体で一意になります。 列c2またはc3の値は一意である必要はありません。
一意インデックスを使用した一意制約の追加
場合によっては、既存の列または列のグループに一意制約を追加することができます。 次の例を見てみましょう。
まず、次の名前のテーブルがあるとしますequipment
:
Code language: SQL (Structured Query Language) (sql)
次に、equip_id
列に基づいて一意のインデックスを作成します。
Code language: SQL (Structured Query Language) (sql)
第三に、equipment_equip_id
インデックスを使用してequipment
テーブルに一意制約を追加します。
Code language: SQL (Structured Query Language) (sql)
ALTER TABLE
ステートメントがテーブルの排他ロックを取得することに注意してください。 保留中のトランザクションがある場合は、テーブルを変更する前にすべてのトランザクションが完了するのを待ちます。 したがって、次のクエリを使用して、進行中の現在の保留中のトランザクションを確認するには、pg_stat_activity
テーブルを確認する必要があります:
Code language: SQL (Structured Query Language) (sql)
結果を見て、値がidle in transaction
のstate
列を見つける必要があります。 これらは完了するために保留されているトランザクションです。
このチュートリアルでは、UNIQUE
制約と、それらを使用して、同じテーブル内の行全体で一意の列または列のグループに格納されている値を強制する方法につ
- このチュートリアルは役に立ちましたか?