【问题标题】:Postgres db deleting parent table row NOT deleting child table row data?Postgres db删除父表行不删除子表行数据?
【发布时间】: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 中的记录被删除,但其他表中的所有记录都保留。

我希望能够以最简单的方式删除记录,并让所有其他引用的表也自动删除。我怎样才能做到这一点?

【问题讨论】:

    标签: java postgresql database-design foreign-keys primary-key


    【解决方案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) 中删除,但从子级中删除时没有一个适用。不存在这样的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-12
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2023-03-04
      相关资源
      最近更新 更多