mysql - 即使另一个孩子将其作为父母,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 children
that 是指 id 为 1 in 的父母parents
),所以当我弄清楚为什么我认为我应该在这里问这个问题时,因为我可能不是唯一对此感到疑惑的人,而且答案对其他人有用。
解决方案
这里有一个误解。外键将孩子绑定到父母 - 而不是相反。
您似乎假设在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
推荐阅读
- flutter - 在颤动中溢出 230 像素
- database - 如何在二级索引而不是主索引上执行 transaction.insert_or_update?
- python - 同一项目的内存分配
- java - How to get Integer#parseInt to return a value in case of overload
- flutter - 当图像 url 在颤动中失败时应用程序崩溃
- c - 为什么 execve 返回的结果与用户不同
- angular - 如何将数据传递给精确的兄弟组件?
- grid - 在 Magento2 管理目录产品网格中添加颜色
- javascript - 将所有返回 Promise 的函数更改为 observable
- mysql - SQL 触发器实现