外部キー制約
外部キー制約について
外部キー制約
外部キー制約とは、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_id
に references 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
終わり