概要:このチュートリアルでは、列または列のグループに格納されている値がテーブル内の行全体で一意であることを確認するためのPostgreSQLUNIQUE制約につ

列または列のグループに格納されている値が、電子メールアドレスやユーザー名など、テーブル全体で一意であることを確認したい場合があります。

PostgreSQLは、データの一意性を正しく維持するUNIQUE制約を提供します。

UNIQUE制約が設定されている場合、新しい行を挿入するたびに、値がすでにテーブルにあるかどうかがチェックされます。 値が既に存在する場合は、変更を拒否し、エラーを発行します。 既存のデータを更新するために同じプロセスが実行されます。

列または列のグループにUNIQUE制約を追加すると、PostgreSQLは自動的に列または列のグループに一意のインデックスを作成します。

PostgreSQL一意制約の例

次の文は、email列のUNIQUE制約を持つpersonという名前の新しいテーブルを作成します。

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制約と、それらを使用して、同じテーブル内の行全体で一意の列または列のグループに格納されている値を強制する方法につ

  • このチュートリアルは役に立ちましたか?
  • はい

コメントを残す

メールアドレスが公開されることはありません。