我有以下示例:1 S4 X7 R. s K6 A1 k' c0 v; T3 k# S7 y
Table A -some_idTable B -another_idTable C -some_id_fk -another_id_fk我想在级联排Table C如果双方some_id并another_id删除各自的表。8 c. T8 }4 i2 U0 D+ _' Y- U6 A
删除两个外键后,如何在表中删除?C中级联本身?0 a' }% U6 x" o P: X+ n9 @
若只删除一个FK,受影响的行应在引用外键的列中改为空值。 1 _; r$ V7 r* K1 Q2 |4 z# Y9 } 7 k* ^- m5 e' ?$ ~* k 解决方案: ( V" s: E' V6 A f5 J 我建议使用两个外键约束ON DELETE SETNULL用触发器处理剩余的, \& e% h1 o' m0 d; _
表格: $ _6 T4 d8 V4 b- I9 oCREATE 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));扳机:# b0 O! a9 r: W, k' Q' ~; a9 q0 n
CREATE OR REPLACE FUNCTION trg_ab_upbef_nulldel() RETURNS trigger AS$func$BEGINDELETE FROM ab WHERE ab_id = NEW.ab_id;RETURN NULL;END$func$ LANGUAGE plpgsql;CREATE TRIGGER upbef_nulldelBEFORE UPDATE OF a_id,b_id ON abFOR EACH ROWWHEN (NEW.a_id IS NULL AND NEW.b_id IS NULL)EXECUTE PROCEDURE trg_ab_upbef_nulldel();SQL提琴。' G" |; _, r4 E6 K+ Z 确保连接表更换PK列。(a_id,b_id)无论如何都不能PK,因为这将不允许两者都这样做NULL。而是加一个UNIQUE允许使用该约束NULL值。 ( u( h; S! G. |6 O触发器优化了性能,只更新了两个FK列之一时才启动,只有当这两个结果被触发时NULL。, B8 [: T0 h' `2 J& k
触发函数很简单:删除并返回NULL取消级联void UPDATE。 ! c8 E( ~+ E, c7 {6 i/ \, }