Postgres db删除父表行不删除子表行数据?
Posted
技术标签:
【中文标题】Postgres db删除父表行不删除子表行数据?【英文标题】:Postgres db deleting parent table row NOT deleting child table row data? 【发布时间】:2021-09-27 05:49:45 【问题描述】:我有一个不是我设计的 postgres 数据库,但我有一些表具有引用其他表的主键 (PK) 的外键 (FK)。我画了一个漂亮的小图来展示这一点:
所以你可以看到我有 (3) 三个模式,它们会有正常的名称,但为了使这个示例变得简单/简单,我只是将它们称为 schema1、schema2 和 schema3。现在,以 table A 为例,有 (3) 三个外键,分别引用 table B、table D 和 table E 直接。
我对研究/谷歌搜索的预期行为是,如果您删除父表(具有子表中外键引用的主键的表),则子表行删除应该自动进行。
我没有看到这种行为 - 也就是说,如果我从 表 A 中删除一条记录,该记录引用 (3) 三个其他表(表 B、表 D 和表 E),则表 A 中的记录被删除,但其他表中的所有记录都保留。
我希望能够以最简单的方式删除记录,并让所有其他引用的表也自动删除。我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:相关行不会自动删除;如果删除一行会使数据库不一致,则默认操作是抛出错误。
如果要删除依赖行,则必须使用ON DELETE CASCADE
定义外键约束。
【讨论】:
"父表(具有外键的表,或者是相反的方式?)" 它是相反的方式。 FK 进入子表。在您的图表中,表 B、D、E 是独立的(父)表,表 A 和 C 是相关的(子)表。表 A 有 3 个父母。图上的n是什么意思,也许它表示null对该列有效,如果是这样,您将不删除子项而是将FK设置为Null;将 FK 定义为 on delete set null. 我认为“n”是表的一对多关系(“n”代表很多,因为 n 可以是 n=1, n=2 , n=3, . ..n=99 等等)。【参考方案2】:我认为在常规词汇表中,表 E 是父表,表 A 是子表。你好像倒过来描述了。
您可以定义 5 种不同的操作,然后从父级 (documented here) 中删除,但从子级中删除时没有一个适用。不存在这样的功能。
【讨论】:
以上是关于Postgres db删除父表行不删除子表行数据?的主要内容,如果未能解决你的问题,请参考以下文章