回答

收藏

删除两个外键约束

技术问答 技术问答 210 人阅读 | 0 人回复 | 2023-09-14

我有以下示例: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/ \, }
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则