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_column
に NULL
がセットされます。
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;