|
|
1
8
在更简单的情况下,如果一条记录从子记录中删除,并且它有一个引用子记录,会发生什么?这是未指定的,因此约束无论如何都会失败。 如果删除一个孩子并没有删除它的叔叔,那么会发生什么呢?叔叔.childid不能为空。 您想要的是以下三件事之一:
|
|
|
2
3
正如您所说的,父级删除正在触发子级删除,我不知道为什么它会在父级表之前转到子级表。我想您必须查看dbms代码才能确定,但我确信有一种算法可以选择首先级联到哪些表。 系统并没有像你在这里暗示的那样真正“理解”东西,它只是遵循它的约束规则。问题是您创建的模式遇到了一个约束,该约束不会让它进一步通过。 我明白你的意思。。如果它首先命中叔叔表,它将删除记录,然后删除子项(而不是从子项删除中命中叔叔级联)。但即便如此,我不认为在现实中会建立一个模式来依赖这种行为。我认为确定发生了什么的唯一方法是查看代码,或者让一位mysql/postgresql程序员在这里讲述它如何处理fk约束。 |
|
|
3
0
@Matt Solnit首先,这是一个很好的问题,据我所知,何时删除父记录,然后innodb首先尝试确定哪些其他表包含对它的引用,以便它也可以从这些表中删除该记录。在您的例子中,它是子表和叔叔表,现在看来,在这种情况下,它决定首先从子表中删除记录,因此它对子表重复相同的过程,并最终失败,因为叔叔持有对子表的引用,但没有为叔叔表中的fk_Child fk指定“ON delete CASCADE”或“ON delete SET NULL”。然而,看起来确实如此 如果 |
|
|
4
-1
设计全错了。您应该有一个表,具有父子关系(literrally)。 然后,您可以通过查询找出叔叔(和阿姨)
|
|
|
developer · 带外键的SQL表设计 1 年前 |
|
|
relatively_random · 确保两个表之间一致的共同参考 1 年前 |
|
|
b126 · 在两种不同的Oracle模式上执行相同查询的速度差异很大 1 年前 |
|
|
robertspierre · 在多对多关系中自动删除未引用的行 2 年前 |
|
|
Michael Samuel · MYSQL在以下情况下自动创建索引 7 年前 |