如何解决即使另一个孩子将其作为父级,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
目前在本地服务器上似乎根本不起作用({{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规则的目的是防止子代不存在子代,而不是防止没有子代的父子
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。