PostgreSQL: 外部キー制約アクションを整理してみる

公開日時: 2022/10/04 09:32:42

PostgreSQLで外部キー制約を使用する際、構文や意味合いを調べがちなので整理してみました。
なお、自分の利用頻度が高い ON DELETE 時の動作で解説しています。

種類

以下の 5 つの種類があります。

  • SET NULL
  • SET DEFAULT
  • NO ACTION
  • RESTRICT
  • CASCADE

SET NULL

親のテーブルから parent_key_column のレコードが削除された際に foreign_key_columnNULL がセットされます。

ALTER TABLE foreign_key_table
    ADD FOREIGN KEY (foreign_key_column) REFERENCES parent_table (parent_key_column) ON DELETE SET NULL;

SET DEFAULT

親のテーブルから parent_key_column のレコードが削除された際に foreign_key_column に デフォルト値 がセットされます。

ALTER TABLE foreign_key_table
    ADD FOREIGN KEY (foreign_key_column) REFERENCES parent_table (parent_key_column) ON DELETE SET DEFAULT;

NO ACTION

何も指定をしなかった場合にはこの NO ACTION が適用されます。

親のテーブルから parent_key_column のレコードを削除しようとした際に foreign_key_column に参照があるとエラーになって削除できません。

ALTER TABLE foreign_key_table
    ADD FOREIGN KEY (foreign_key_column) REFERENCES parent_table (parent_key_column) ON DELETE NO ACTION;

RESTRICT

親のテーブルから parent_key_column のレコードを削除しようとした際に foreign_key_column に参照のある / なしに関わらずエラーになって削除できません。

NO ACTION と似ていますが、参照行が存在していなくても削除できないという点が異なるみたいです。

ALTER TABLE foreign_key_table
    ADD FOREIGN KEY (foreign_key_column) REFERENCES parent_table (parent_key_column) ON DELETE RESTRICT;

CASCADE

親のテーブルから parent_key_column のレコードが削除された際に foreign_key_column も同時に削除されます。

ALTER TABLE foreign_key_table
    ADD FOREIGN KEY (foreign_key_column) REFERENCES parent_table (parent_key_column) ON DELETE CASCADE;

参考