外部キー制約

外部キー制約について

外部キー制約

外部キー制約とは、2つのテーブル間の整合性を保つための制約です。

2つのテーブル A と B を考え、B が A を参照するカラムを持つとします。
そのとき、「B の A を参照するカラムは、対応するレコードが A 内に存在しなければならない」という制約を考えます。
これが、外部キー制約です。

例えば、2つのテーブル A, B を以下のように考えます。

A

column_name type
id integer
name string

B

column_name type
id integer
a_id integer

テーブル B の a_id カラムは、テーブル A の id カラムを参照しています。
結合する際には、この B の a_idと A の idで行います。

SELECT *
FROM A
INNER JOIN B ON A.id = B.a_id

そして、B の a_id に外部キー制約をつけます。
そうすると、B にレコードを挿入する際、a_id に対応するレコードがテーブル A 内に存在しなければエラーになります。

これにより、B は存在しない a_id を持つレコードが挿入できないため、テーブル A とテーブル B の整合性が保たれます。

PostgreSQL で試す

上で載せたテーブル A と B を使っていきます。
まずは、テーブルを作成します。

CREATE TABLE a ( 
  id integer primary key, 
  name varchar(255)
);

CREATE TABLE b ( 
  id integer primary key, 
  a_id integer references a(id)
);

テーブル B の作成時に、a_idreferences a(id) をつけています。
これが PostgreSQL での、外部キー制約の設定方法になります。

続いて、テーブル A にデータを挿入します。

INSERT INTO a (id, name) 
VALUES
  (1, 'xxx'), 
  (2, 'yyy'), 
  (3, 'zzz');

では、テーブル B にデータを挿入していきます。
まずは、A に存在する a_id のデータを挿入します。

INSERT INTO b (id, a_id)
VALUES
  (1, 2);

挿入操作が成功しました。

続いて、A に存在しない a_idのデータを挿入してみます。

INSERT INTO b (id, a_id)
VALUES
  (2, 4);

結果はこのようになりました。

ERROR:  insert or update on table "b" violates foreign key constraint "b_a_id_fkey"
DETAIL:  Key (a_id)=(4) is not present in table "a".

テーブル A に対応する id が存在しないために、エラーになりました。
これが、外部キー制約です。

参考: https://www.postgresql.jp/document/12/html/tutorial-fk.html

終わり