gpt4 book ai didi

python - (Django) MySQL外键级联是否先删除父项或子项

转载 作者:行者123 更新时间:2023-11-29 06:04:15 24 4
gpt4 key购买 nike

目前,我正在使用 Django 和 MySQL 后端数据库。

让我们有以下数据库模式

class Parent(models.Model):
parent_id = models.BigAutoField(primary_key=True)
last_child = models.ForeignKey('Child', on_delete=models.PROTECT)

class Child(models.Model):
child_id = models.BigAutoField(primary_key=True)
parent = models.ForeignKey('Parent', on_delete=models.CASCADE)

每个 parent 可以有多个 child ,但每个 child 只能有一个 parent 。字段 last_child 指向 parent 生的最后一个 child 。我想通过这个模式表达的是

  • 只要其 parent 还活着,最后一个 child 就不会死(被删除)

  • 当 parent 去世时,所有 child 都会死亡

但是,由于 PROTECTCASCADE 的冲突,我对数据库完整性有些担忧。

我的问题是,如果我删除 Parent,MySQL 会首先尝试删除什么?它会先删除 Parent 行,然后尝试删除 Child 行,还是相反?

最佳答案

当你删除一个对象时 Django 做了什么 -> 它先删除所有子对象,然后删除对象。

你的模式有点奇怪,你需要让你的 last_child 对象 nullable,因为你将如何创建一个 parent 没有 child ?

你不能创建一个没有parentchild,你也不能创建一个有last_child<的parent/.

所以当你让你的 last_child 可以为空时,在 parent.delete 上你需要设置 last_child = null,然后调用 parent.delete()。我想你会没事的。

关于python - (Django) MySQL外键级联是否先删除父项或子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42732351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com