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
,这是否也会删除 parents
中 id
的行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
这是一个关于 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
,这是否也会删除 parents
中 id
的行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