首页 > 解决方案 > 即使另一个孩子将其作为父母,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,这是否也会删除parents其中id为 1 的行,即使其中还有另一行children也将其作为父行?根据我ON DELETE CASCADE迄今为止所读到的有关行为的信息,似乎是这样,但这并不是很聪明。所以,换句话说,我想知道这是否ON DELETE CASCADE愚蠢。

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

标签: mysqlsqlforeign-keyssql-deletecreate-table

解决方案


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

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

这是基于您的设置的示例:

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, 1), (3, 2);

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

-- related children where deleted
select * from children;

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

推荐阅读