【问题标题】:(Django) Does MySQL foreign key cascade delete parent or children first(Django) MySQL外键级联是否先删除父级或子级
【发布时间】:2017-03-11 06:58:26
【问题描述】:

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

让我们拥有以下数据库架构

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)

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

  • 只要其父级还活着,最后一个子级就不能死(被删除)

  • 当父母去世时,所有孩子都会死

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

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

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    Django 删除对象时的作用 -> 它先删除所有子对象,然后再删除对象。

    您的架构有点奇怪,您需要将您的last_child 对象设为null-able,因为如果没有children,您将如何创建parent

    您无法创建没有parentchild,也无法创建带有last_childparent

    因此,当您将last_child 设为可空时,在parent.delete 上您需要设置last_child = null,然后调用parent.delete()。我猜你会没事的。

    【讨论】:

    • 感谢您的回复。至于您对可空性的担忧,这是我的一个简单错误,因为我忘记将其放入。在您的帮助下,我现在已经解决了我的问题
    猜你喜欢
    • 2012-09-21
    • 2011-02-24
    • 2018-04-13
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多