外部キーを含む行を削除したいのですが、次のようなことを試します。
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
テーブル のロックkontakty
とSHARE ROW EXCLUSIVE
テーブル のロックが必要ですosoby
。
ALTER
テーブルを削除できない場合は、手動で削除する (1 回) か、トリガーで削除するBEFORE DELETE
(毎回) というオプションが残ります。