ON DELETE CASCADE 是否会删除 parent,即使另一个 child 将其作为 parent?

Will ON DELETE CASCADE delete a parent even if another child has it as parent?

这是一个关于 MySQL 的行为的问题(我有 8.0.18 版,这是值得的)当您删除 table 中使用 [=17 创建的行时=] 子句。

假设我有这 2 个 tables:

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;

我们还假设我在其中插入了一些数据,因此 parents 看起来像这样:

id
--
1
2

和children看起来像这样:

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

现在假设我这样做:

DELETE FROM children WHERE parent_id='1'

我的问题是,由于我用来创建 children 的查询中的 ON DELETE CASCADE,这是否也会删除 parentsid 的行1,即使 children 中还有另一行也有它作为 parent?根据我目前所了解的 ON DELETE CASCADE 的行为,情况似乎是这样,但这并不是很聪明。所以,换句话说,我想知道 ON DELETE CASCADE 是不是那么蠢。

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

反之亦然: 如果删除 parent 本身,children 也会被删除。

如果您删除了 children 中的任何一个,即使您删除了所有这些,parent 也会保留。 这是因为 ON DELETE CASCADE 规则的要点是防止 children 有 non-existent parent,而不是防止没有 [=15] 的 parent =]

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

您似乎假设 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, 1), (3, 2);

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

-- related children where deleted
select * from children;

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