删除表时的外键依赖项
Posted
技术标签:
【中文标题】删除表时的外键依赖项【英文标题】:Foreign Key dependencies While deleting table 【发布时间】:2020-05-07 21:15:22 【问题描述】:在我的 Postgresql 中,我有一个主表 TABLE_MAIN 包含 10 列,其中 7 列是其他 7 个表的主键的外键。
现在,在其中一个表(不是 TABLE_MAIN)中,我们将其称为 child_table,每当我点击 UI 中的 Refresh 按钮时,我我正在使用以下 Django ORM 查询清空 child_table 中的所有数据,然后插入相关数据。
child_table.objects.all().delete()
我在 TABLE_MAIN 中有很多重要数据,大约 1000 行,令我震惊的是,每当我点击 UI 中的刷新按钮时(删除了 child_table 中的所有数据strong>) 我发现 TABLE_MAIN 数据完全消失了。
这里发生了什么?是因为外键依赖吗?
其他child_tables数据是完全安全的,但是TABLE_MAIN数据丢失了。
删除 child_table 中的一个主键,它是 TABLE_MAIN 字段的外键,会影响丢失 TABLE_MAIN 中的所有数据吗?
【问题讨论】:
你的模型是怎么写的?您能否向我们展示您的部分代码,其中显示了这些外键声明? 听起来你的外键约束是倒退的。 @BernardoDuarte ,所有外键格式如下“models.ForeignKey(table, on_delete=models.CASCADE, null=True)” @MikeSherrill'CatRecall' ,你所说的向后是什么意思?...我说 TABLE_MAIN 中的一列是 child_table 的外键(默认情况下它映射到这个子表的主表) 【参考方案1】:Django 的 ForeignKey 字段提供了一个特殊的选项on_delete,让您指示 Django 在删除相关模型的情况下该怎么做。您可能将此值设置为 CASCADE ,当您从数据库中删除某个对象时,它会删除所有包含 ForeignKey 的对象。如果您不希望这种行为,您应该考虑将 PROTECT、SET_NULL、SET_DEFAULT 传递给 ForeignKey 字段中的 on_delete 选项。
【讨论】:
"models.ForeignKey(TABLE_MAIN, on_delete=models.CASCADE, null=True)" 是我目前在我的模型中拥有的属性....你要我删除 on_delete=models.CASCADE ? on_delete 是 Django 所必需的,因此您应该将其更改为我上面提到的选项之一,例如 on_delete=models.PROTECT 我可以删除 child_table 中的所有数据并插入,但我希望它不会影响其他表,所以如上所述,我将使用 "on_delete=models.SET_NULL" 和 null =True .....我的方向正确吗? 是的,这行得通。但是,请注意,在这种情况下,您的字段必须允许空值,例如ForeignKey(some_model, null=True) 当然,非常感谢!我很高兴我在很早的时候就发现了这一点以上是关于删除表时的外键依赖项的主要内容,如果未能解决你的问题,请参考以下文章