首页 / 知识
关于mysql:ON DELETE CASCADE约束按什么顺序处理?
2023-04-15 04:44:00

In what order are ON DELETE CASCADE constraints processed?这是我正在进行的操作的一个示例:
注意,Uncle-Child关系没有ON DELETE CASCADE。 即删除孩子不会删除其叔叔,反之亦然。 当我有一个父母和一个带相同孩子的叔叔,并且删除了父母时,似乎InnoDB应该能够"弄清楚它"并让整个家庭级联起来(即删除父母会删除叔叔) 以及儿童)。 但是,我得到以下信息:
InnoDB试图在引用它的叔叔之前级联删除Child。 我想念什么吗? 是否由于某种我不理解的原因而失败? 还是有一些使它起作用的技巧(或者它是MySQL中的错误)? 在较简单的情况下,如果从Child中删除一条记录,并且该记录具有引用的Uncle会发生什么?这是未指定的,因此约束仍然会失败。 如果删除孩子没有删除其叔叔,那会发生什么呢? Uncle.childid不能为null。 您想要的是以下三件事之一: 如您所述,父级删除操作会触发子级删除操作,但我不知道为什么它会在叔叔表之前进入子级表。我想您肯定需要查看dbms代码才能知道,但是我肯定有一种算法可以选择首先层叠哪些表。 该系统并没有真正按照您在此处暗示的方式"弄清楚"这些内容,它只是遵循其约束规则。问题在于您创建的架构遇到了不允许其进一步传递的约束。 我明白你在说什么..如果它先打到叔叔表上,它将删除记录,然后删除子级(而不是从子级删除中打到叔叔级联)。但是即使这样,我也不认为会建立一个架构来依赖现实中的这种行为。我认为唯一可以确定正在发生什么事情的方法是浏览代码或在这里找一个mysql / postgresql程序员来说明它如何处理fk约束。 @Matt Solnit首先,这确实是一个好问题,据我所知,当要删除来自Parent的记录时,innodb首先尝试确定哪些其他表包含对该记录的引用,以便它可以从中删除记录好。在您的情况下,它是Child表和Uncle表,现在看来,在这种情况下,它决定首先从Child表中删除记录,因此它对Child重复相同的过程,最终由于Uncle保留对Child表的引用而失败,但是都不起作用。在Uncle表中为fk_child FK指定了DELETE CASCADE"或" ON DELETE SET NULL"。但是,如果innodb首先尝试从Uncle表中删除记录,则删除应该顺利进行。再三考虑之后,我认为由于innodb遵循ACID模型,因此它选择了Child而不是Uncle来启动删除过程,因为即使它以Uncle开头,即使Child中的删除可能仍然失败,例如假设一个具有fk_child键(类似于Uncle)但没有ON DELETE CASCADE的Friend表,现在这仍然会导致整个事务失败,因此对我来说这是正确的行为。换句话说,innodb从表开始,这可能会导致事务失败,但实际上我的理论是完全不同的。 :)
设计全错了。您应该具有单个表,并且具有父子关系(从字面上看)。
|
最新内容
相关内容
linux分辨率操作命令?
linux分辨率操作命令?,系统,情况,分辨率,底部,状态,命令,屏幕,屏幕分辨率,桌面,显示器,怎么调整linux的屏幕分辨率?1、Linux系统更改屏幕分辨linux常见操作命令?
linux常见操作命令?,系统,工作,信息,管理,地址,命令,目录,单位,数据,标准,linux必学的60个命令1、安装和登录命令:login、shutdown、halt、rebo红帽子linux操作命令?
红帽子linux操作命令?,服务,系统,密码,环境,信息,通用,软件,状态,设备,命令,红帽linux如何开启sshd服务1、打开linux终端命令行,输入如下命令即linuxmv命令示例?
linuxmv命令示例?,名称,系统,文件,命令,目录,文件夹,不了,工作,管理,路径,在linux下用mv命令可以批量的移动文件吗linux下使用mv命令来移动文linux日常操作命令?
linux日常操作命令?,工作,系统,地址,信息,命令,目录,基础,管理,操作,功能,linux系统常用操作命令1、linux常用命令有pwd命令、cd命令、ls命令go操作linux命令?
go操作linux命令?,系统,工具,环境,软件,标准,网上,最新,信息,设备,电脑,Linux启动进程的命令1、实现调度启动进程的方法有很多,比如通过crontablinux命令操作vim?
linux命令操作vim?,系统,地址,工作,命令,模式,标准,信息,入口,连续,时间,Linux基础-vim模式普通模式用的编辑器命令,比如移动光标,删除文本等等linux操作不了命令?
linux操作不了命令?,系统,密码,不了,命令,位置,信息,情况,网络,地址,定期,linux命令不可用1、这个方法应该适合任何没有连接网络的情况,在命令linux运维操作命令?
linux运维操作命令?,系统,网络,基础,标准,工具,信息,工作,命令,软件,数据,linux运维命令常用命令1、ls, ls-l, less, head, tail, tail -f, ln, ln -slinux命令行常见操作?
linux命令行常见操作?,系统,工作,地址,管理,信息,命令,目录,一致,基础,标准,linux系统怎么用1、Linux的用处linux是一套免费开放源代码的操作linux清空操作命令?
linux清空操作命令?,系统,数据,命令,名称,不了,文件夹,文件,环境,回收站,目录,删除文件夹中所有文件的linux命令(创建和删除文件和文件夹的linlinux安装操作命令?
linux安装操作命令?,系统,工作,地址,工具,服务,情况,信息,命令,最新,管理,linux系统常用操作命令1、linux常用命令有pwd命令、cd命令、ls命令