这是一个关于当您删除使用
DELETE ON CASCADE
子句创建的表中的行时 MySQL 行为的问题(我有 8.0.18 版本,因为它的价值)。
假设我有这两张表:
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
中的第二个孩子,所以children
中没有剩余的孩子指的是parents
中id为1的父母,所以当我弄清楚为什么我认为我应该在这里问这个问题时因为我可能不是唯一一个对此感到好奇的人,答案对其他人也很有用。
这里有一个误解。外键将子级绑定到父级 - 但反之则不然。
您似乎认为
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
反之亦然: 如果您删除父级本身,子级也会被删除。
如果删除任何子级,即使删除所有子级,父级也会保留。 这是因为 ON DELETE CASCADE 规则的目的是防止子级拥有不存在的父级,而不是阻止没有子级的父级