Postgres Foreign Key Constraint Tutorial

Introduction

PostgreSQLでデータを操作している場合は、外部キーの使用方法を知ることが重要です。 外部キーは、2つのテーブル間の参照整合性を維持するように設計された特定のタイプのSQL制約です。 簡単に言えば、外部キーは、2つのテーブルのデータ間のリンクを確立する列または列のセットです。 一方のテーブルの外部キーは、他方のテーブルの主キーを参照するため、テーブル間のリレーションシップが作成されます。 この記事では、Postgresの外部キーを作成する方法と、その使用例をいくつか見ていきます。

前提条件

このチュートリアルを進めると、外部キー関係を持つテーブルを扱うため、Postgresとそのpsqlコマンドラインインターフェイスの両方がインストールされていることを確認する必要があります。 また、それぞれの列の1つに対してその制約を共有する2つのテーブルが必要です。

psqlへのアクセス権があることを確認してください

psql -Vコマンドを使用して、psqlとPostgresがインストールされ、正常に動作していることを確認できます。 Postgresに接続し、コマンドラインインターフェイスを入力するには、psqlコマンドを単独で使用します。

注:psql: FATAL: role "linux" does not existというメッセージでエラーが発生した場合、Postgresはおそらくシステムのユーザー名を使用してpsqlに接続しようとしています。 これを解決するには、sudo -u postgres -iコマンドを使用してユーザー名をpostgresに切り替えてから、psqlに再度アクセスしてみてください。

psqlバージョンとロール"linux"のスクリーンショットはPostgresのエラーが存在しません

外部キーのテーブルを作成

最初に行うことは、psqlコマンドラインインターフェイスを使用してデータベースを作成することです。

以下に示す基本的なコマンド構文を使用してPostgreSQLデータベースを作成することができます:

1
データベースdb_nameの作成;

ここに例があります:

1
データベースtestdbの作成;

また、”母”テーブルとして機能するテーブルや、他のテーブルとの関係を持つテーブルを作成することもできます。 以下に示す基本的な構文を使用します:

1
テーブルの作成TABLE_NAME(COLUMN_NAME+DATA_TYPE+CONSTRAINT)

このチュートリアルでは、主キーidを持つpriceというテーブルを作成します:

1
テーブルpriceの作成(id INT主キー,PRICE REAL);

次のセクションでは、priceテーブルのid列と外部キーの関係を持つ別のテーブルを作成します。

外部キー制約の使用

前述したように、FOREIGN KEY制約は別のテーブルの主キーを参照します。 各キーは他のテーブルとの関係に依存します。

FOREIGN KEY制約を持つテーブルを作成するには、他のテーブルを参照する必要があります。 次の例を見てみましょう:

1
2
3
4
5
テーブルcarsを作成します(
car_id INT NULLではありません,
price INT参照price(id),それに対応します
名前テキスト,
ブランドテキスト);

carsテーブルには、priceテーブルを参照する外部キーがあります。 これは、「子」テーブルの外部キー列の値が参照として「母」テーブルから取得されることを意味します。

テーブルの詳細を表示するには、\dコマンドの後にテーブル名を続けて使用します:

1
2
3
4
5
6
7
8
9
テーブル”公開。cars”
列/型/照合/NULL許容|デフォルト
——–+———+———–+———-+———
car_id|INTEGER||NULLではありません|
価格|INTEGER|||
名前|テキスト|||
ブランド|テキスト|||
外部キー制約:
“cars_price_fkey”外部キー(価格)参照価格(id)

また、CREATE TABLEコマンドで列名を宣言するときに、FOREIGN KEYキーワードとキーワードを明示的に使用して外部キー制約を宣言することもできます:

1
2
3
4
5
6
7
8
テーブルの作成cars(
car_id NOT NULL,
price INT,
name TEXT,
brand TEXT
PRIMARY KEY(car_id),
FOREIGN KEY(price)REFERENCES price(id);
);

この時点で、テーブルcars内のレコードを誤って削除した場合、何が起こるのか疑問に思うかもしれません—エラーが発生しますか? 実際、Postgresでは、他の対応するテーブルのレコードも削除されない限り、レコードを削除することはできません。

次のいずれかのオプション–NO ACTIONDELETE CASCADEDELETE RESTRICT—を使用して、別のテーブルにリンクされているレコードが削除されたときに何が起こるかを決定できます。

次の例は、テーブルに適用されているDELETE RESTRICT制約を示しています:

1
2
3
4
5
CREATE TABLE cars(
car_id INT NOT NULL,
price INT REFERENCES price(id)ON DELETE RESTRICT,
name TEXT,
brand TEXT);

注:この制約では、リンクされているすべての値が削除されるか、制約自体が削除されない限り、行を削除することはできません。

次の例は、動作中のDELETE CASCADE制約を示しています:

1
2
3
4
5
CREATE TABLE cars(
car_id INT NOT NULL,
price INT REFERENCES price(id)ON DELETE CASCADE,
name TEXT,
brand TEXT);

注:DELETE CASCADE制約を使用すると、親レコードを削除できますが、対応する子レコードも削除されることに注意することが重要です。 カスケード削除は、意図せずに別のテーブルの行を削除するのは簡単すぎるため、本番環境での使用にはお勧めしません。

NO ACTIONオプションはPostgreSQLのデフォルトアクションで、上記の二つの制約のいずれかが指定されていない場合にエラーを表示します。

結論

リレーショナルデータベースでは、異なるテーブルのデータに特定のリンクやリレーションシップがあるのが一般的です。 Foreign key制約は、このデータの参照整合性を保護する効果的な方法を提供し、別のテーブル内のデータとの関係が存在する場合に、あるテーブルからデータが削除され このチュートリアルでは、Postgresの外部キーがどのように機能するかの概要と、この制約をさまざまな方法で使用する方法の例を提供しました。 これらの例をガイドとして使用することで、独自のPostgreSQLデータベースに外部キー関係を実装することができます。

コメントを残す

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