1. ホーム
  2. sql

[解決済み] PostgreSQL の外部キーによる行の削除

2022-10-21 07:52:30

質問

外部キーを含む行を削除したいのですが、以下のようにすると削除できます。

DELETE FROM osoby WHERE id_osoby='1'

こんな文が出ます。

ERROR: テーブル "osoby" の更新または削除は、テーブル "kontakty" 上の外部キー制約 "kontakty_ibfk_1" に違反します。 DETAIL キー (id_osoby)=(1) がテーブル "kontakty" からまだ参照されています。

これらの行を削除するにはどうすればよいですか。

どのように解決するのですか?

これを自動化するために、外部キー制約を 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 コマンドを使用します。制約を削除して再作成するには、1つの ALTER TABLE ステートメントを使用して、同時書き込みアクセスで起こりうる競合状態を回避します。

そうするためには、当然ながら権限が必要です。この操作には ACCESS EXCLUSIVE テーブルをロックします。 kontaktySHARE ROW EXCLUSIVE ロックオンテーブル osoby .

もし、あなたが ALTER テーブルを削除することができない場合、手作業(一度だけ)またはトリガーによって BEFORE DELETE (毎回) が残りの選択肢です。