【发布时间】:2020-07-31 17:14:29
【问题描述】:
我有一个 Postgres 数据库,其中包含许多表,每个表包含许多行,这些不同的表之间有许多各种类型的关系。
如果我在所有这些表中添加一个新列 should_delete,是否有一些自动方法可以删除所有行 WHERE should_delete = true,而无需手动指定应从中删除行的每个表,或手动排序查询,以便在引用它们的其他行之前删除行(从而避免由于约束失败而导致的错误,例如,通过在包含外键的行之前删除由外键引用的行,即使两行都包含 should_delete = true 并且应该被删除)?
这最终会导致所有标记为 should_delete = true 的行都被删除,并且没有标记为 should_delete = false 的行被删除,但只有在无法在不违反约束的情况下仅删除标记为 should_delete = true 的行时才会导致错误.
如果没有纯粹的 Postgres 方式来实现这一点,我也在使用 Python 和 Django 来访问这个数据库,所以如果有一个 Python 包可以用来做到这一点也是可以接受的。
【问题讨论】:
-
如果表之间有
FOREIGN KEY关系,为什么不使用ON DELETE CASCADE?然后从父项中删除,子项记录也被删除。 -
@AdrianKlaver 我对此持谨慎态度的几个原因:我不想删除所有引用父项的记录,只删除带有
should_delete = true的记录;我不一定知道在每种情况下要从哪个父级开始,它可能是在不同表中相互引用的任意一组行;并且这种行为是我想为单个功能/在单个事务中执行的特殊情况,如果要删除某些顶级父记录,我会发现在所有其他情况下级联删除所有数据是非常危险的. -
老实说,我认为这整件事是灾难的根源,也是计划不周的标志。您冒着忘记
should_delete = true的记录以及在条件发生变化时删除您不想删除的记录的巨大风险。我赞成通过在每个查询中选择它们来删除所需记录的显式方法,而不是依赖某些您可能不记得已设置的信息。 -
@AdrianKlaver 是对的,但让我们深入研究一下这个问题 :-) 这意味着如果您的 TableA 依赖于 TableB 但只有在 TableA 记录中有 should_delete = True ,这意味着您不应该删除它记录,因为 TableB 中的记录 should_delete 为 False(或为空或其他) - 这就是您要实现的目标吗?
-
感谢您的想法@AdrianKlaver - 我认为在不了解存在哪些约束、数据的重要性等详细信息的情况下,很难说特定的数据库设计有多好。这是对我正在尝试做的事情的有意最小化的描述,只是为了看看是否有一些简单的方法可以实现这一点,我也在考虑其他选择。
标签: python django database postgresql