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) 三个模式,它们会有正常的名称,但为了使这个示例变得简单/简单,我只是将它们称为 schema1schema2 schema3。现在,以 table A 为例,有 (3) 三个外键,分别引用 table Btable Dtable 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删除父表行不删除子表行数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套的子表值与父表行关联并插入子表值对应于php中的父表行

子表行的休眠批处理

不同步时如何重置postgres的主键序列?

不同步时如何重置postgres的主键序列?

循环删除单个表行

如何过滤 bigquery 的重复表行数据以删除重复行?