PostgreSQLで外部キーを持つ行を削除する 質問する

PostgreSQLで外部キーを持つ行を削除する 質問する

外部キーを含む行を削除したいのですが、次のようなことを試します。

DELETE FROM osoby WHERE id_osoby='1'

次のような声明が出ました:

エラー: テーブル「osoby」の更新または削除は、テーブル「kontakty」の外部キー制約「kontakty_ibfk_1」に違反します。詳細: キー (id_osoby)=(1) は、引き続きテーブル「kontakty」から参照されています。

これらの行を削除するにはどうすればいいでしょうか?

ベストアンサー1

これを自動化するには、外部キー制約を次のように定義しますON DELETE CASCADE
外部キー制約のマニュアル:

CASCADE参照されている行が削除されると、それを参照している行も自動的に削除されることを指定します。

現在の FK 定義を次のように調べます。

SELECT pg_get_constraintdef(oid) AS constraint_def
FROM   pg_constraint
WHERE  conrelid = 'public.kontakty'::regclass  -- assuming public schema
AND    conname = 'kontakty_ibfk_1';

次に、次のようなステートメントで、ON DELETE ...部分を追加または変更します(他のすべてはそのままにします)。ON DELETE CASCADE

ALTER TABLE kontakty
   DROP CONSTRAINT kontakty_ibfk_1
 , ADD  CONSTRAINT kontakty_ibfk_1
   FOREIGN KEY (id_osoby) REFERENCES osoby (id_osoby) ON DELETE CASCADE;

コマンドはありません。同時書き込みアクセスによる競合状態を回避するには、ALTER CONSTRAINT単一のステートメントで制約を削除して再作成します。ALTER TABLE

当然、これを行うには権限が必要です。この操作では、ACCESS EXCLUSIVEテーブル のロックkontaktySHARE ROW EXCLUSIVEテーブル のロックが必要ですosoby

ALTERテーブルを削除できない場合は、手動で削除する (1 回) か、トリガーで削除するBEFORE DELETE(毎回) というオプションが残ります。

おすすめ記事