簡體   English   中英

兩個外鍵約束的級聯刪除

[英]CASCADE DELETE on two foreign key constraints

我有以下示例:

Table A
   -some_id

Table B
   -another_id

Table C
   -some_id_fk
   -another_id_fk

如果some_idanother_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM