[英]CASCADE DELETE on two foreign key constraints
我有以下示例:
Table A
-some_id
Table B
-another_id
Table C
-some_id_fk
-another_id_fk
如果some_id
和another_id
從各自的表中刪除,我想在Table C
some_id
一行。
當兩個外鍵被刪除時,如何在表 C 級聯中創建一行?
如果僅刪除了一個 FK,則受影響的行應在引用該外鍵的列中更改為空值。
我建議使用ON DELETE SET NULL
兩個外鍵約束和一個負責其余部分的觸發器
表格:
CREATE TABLE a (a_id serial PRIMARY KEY, a text NOT NULL);
CREATE TABLE b (b_id serial PRIMARY KEY, b text NOT NULL);
CREATE TABLE ab (
ab_id serial PRIMARY KEY
, a_id int REFERENCES a ON DELETE SET NULL
, b_id int REFERENCES b ON DELETE SET NULL
, UNIQUE (a_id, b_id)
);
扳機:
CREATE OR REPLACE FUNCTION trg_ab_upbef_nulldel()
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
DELETE FROM ab WHERE ab_id = NEW.ab_id;
RETURN NULL; -- to cancel UPDATE
END
$func$;
CREATE TRIGGER upbef_null2del
BEFORE UPDATE OF a_id, b_id ON ab
FOR EACH ROW
WHEN (NEW.a_id IS NULL AND NEW.b_id IS NULL)
EXECUTE PROCEDURE trg_ab_upbef_nulldel();
db<> 在這里擺弄
舊的 sqlfiddle
確保有一個用於連接表的代理 PK 列。 (a_id, b_id)
無論如何都不能是 PK,因為這將不允許兩者都為 NULL。 添加一個UNIQUE
約束,它允許 NULL 值。
觸發器針對性能進行了優化,並且僅在兩個 FK 列之一更新時才啟動,並且僅當這兩個列都為NULL
時才啟動。
觸發器函數刪除該行並返回 NULL 以取消現在無效的級聯UPDATE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.