回答

收藏

如何删除级联从子表到父表?

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

我准备了一个 小提琴    演示这个问题。* e& T) B5 C& u4 M, e0 Z
CREATE TABLE parent (   parent_id integer primary key);CREATE TABLE child (   child_name TEXT primary key,  parent_id integer REFERENCES parent (parent_id) ON DELETE CASCADE);INSERT INTO parent VALUES (1);INSERT INTO child VALUES ('michael一、vanessa',1);我想在删除子记录时删除它CASCADE记录父亲的方法。* x% Q' M( g" Y7 e3 r! Y$ b: q
例如:
- ]. O" E$ s7 C5 N: JDELETE FROM child WHERE child_name='michael';这应该级联到父表并删除记录。$ N& V& k6 H- y: s) e$ }9 [( b6 p8 Q
                                                                / @/ y5 c+ X8 A3 l* ^4 X
    解决方案:                                                               
/ u2 S( m* N- p* P3 N                                                                外键只在另一个方向工作:从父级删除到子级联。因此,当删除父级(引用)记录时,也会删除所有子级(引用)记录。
, h4 u& Y: J3 ^8 Q若为1:1关系,则可创建双向外关系,其中一侧为DEFERRABLE INITIALLY DEFERRED,两边都是级联。
( B8 b* b+ Z2 X* j$ Q7 r& L! ^否则,你会需要的ON DELETE ... FOR EACHROW在子表上创建触发器,在没有剩余子级的情况下删除父行。INSERTs可能导致竞争条件;你需要SELECT ... FORUPDATE父记录,然后    检查其他子记录。插入时的外键检查会FOR SHARE锁定引用(父)记录,防止任何争议。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则