即使另一个孩子将其作为父级,ON DELETE CASCADE也会删除其父级吗?

问题描述

这是一个有关MysqL行为的问题(我有8.0.18版的价值),当您删除DELETE ON CASCADE子句创建的表中的一行时,便会这样做。

假设我有以下两个表:

CREATE TABLE parents (
    id INT NOT NULL,PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE children (
    id INT,parent_id INT,INDEX par_ind (parent_id),FOREIGN KEY (parent_id) 
        REFERENCES parent(id)
        ON DELETE CASCADE
) ENGINE=INNODB;

我们还假设我在其中插入了一些数据,以便父母看起来像这样:

id
--
1
2

孩子们看起来像这样:

id | parent_id
--------------
1  |    1
2  |    1

现在假设我这样做:

DELETE FROM children WHERE parent_id='1'

我的问题是,由于我以前用于创建ON DELETE CASCADE查询中的children,是否还会删除parentsid为1的行,即使children中还有另一行也将其作为父行?根据到目前为止我对ON DELETE CASCADE的行为的了解,情况似乎确实如此,但这并不是很明智。因此,换句话说,我想知道ON DELETE CASCADE是不是很傻。

我试图通过测试刚刚描述的示例来弄清楚自己,但是由于某种原因,ON CASCADE DELETE目前在本地服务器上似乎根本不起作用({{1中没有任何内容删除}},即使我删除parents中的第二个孩子,因此children中也没有剩余的孩子指向children中id为1的父对象,所以当我弄清楚为什么我认为我应该在这里提出这个问题,因为我可能不是唯一一个对此有所疑问的人,而且答案对其他人也将有用。

解决方法

这里有一个误解。外键将孩子绑定到父母,而不是相反。

您似乎假设on delete cascade会在删除孩子后删除父级。情况并非如此:删除父级时,相关的子级也将删除。

根据您的设置,这里是an example

create table parents (
    id int not null,primary key (id)
);

create table children (
    id int,parent_id int,foreign key (parent_id) references parents(id) on delete cascade
);

-- parent 1 has two children,parent 2 has one child
insert into parents values (1),(2);
insert into children values (1,1),(2,(3,2);

-- delete parent 1
delete from parents where id = 1;

-- related children where deleted
select * from children;

id | parent_id
-: | --------:
 3 |         2
,

它以另一种方式起作用: 如果删除父级本身,则子级也会被删除。

如果删除任何子级,即使删除所有子级,父级也会保留。 这是因为ON DELETE CASCADE规则的目的是防止子代不存在子代,而不是防止没有子代的父子