用語集のすべての用語

外部キー

PostgreSQL の外部キーとは?

外部キーは、あるテーブルの値が別のテーブルの行と一致することを要求するため、存在しない行を指すことはできません。参照先の行が削除されたときの動作は ON DELETE で決まります。

外部キー制約は、ある列(または列のグループ)の値が、別のテーブルのいずれかの行の値と一致しなければならないことを指定します。これにより関連するテーブル間の整合性が保たれ、存在しない行を指す挿入や更新は拒否されます。

参照される列は、主キーであるか一意制約を持っている必要があります。参照されている行が削除されたときの動作は ON DELETE アクションで決まります。NO ACTION(デフォルト)と RESTRICT は削除を拒否し、CASCADE は参照している行も削除し、SET NULL または SET DEFAULT はそれらの行の値を変更します。PostgreSQL は参照する側の列に自動でインデックスを作成しないため、そこにインデックスを追加すると効果的なことがよくあります。

例

この例では、ON DELETE CASCADE で invoices を customers に関連付けます。顧客を削除するとその請求書も削除されるため、最終的な件数は 0 になります。

CREATE TABLE customers (id int PRIMARY KEY, name text NOT NULL);
CREATE TABLE invoices (
  id int PRIMARY KEY,
  customer_id int NOT NULL REFERENCES customers (id) ON DELETE CASCADE,
  amount numeric NOT NULL
);
INSERT INTO customers VALUES (1, 'Acme');
INSERT INTO invoices VALUES (10, 1, 99.50);

DELETE FROM customers WHERE id = 1;
SELECT count(*) FROM invoices;

拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。

出典

PostgreSQL 公式ドキュメント(英語)。

関連用語