gpt4 book ai didi

mysql - 删除子 SQL 记录和父 SQL 记录

转载 作者:行者123 更新时间:2023-11-29 06:02:32 24 4
gpt4 key购买 nike

我希望删除给定 id 的 child ,如果 child 的 parent 在 child 被删除后不再有 child ,我也想删除 parent 。 CASCADE DELETE 非常适合删除已删除父级的子级,但是,这不是我的意图。强制执行外键约束,我不想暂时禁用。我宁愿不使用触发器或存储过程。

CREATE TABLE IF NOT EXISTS parents (
id INT NOT NULL,
data VARCHAR(45) NULL,
PRIMARY KEY (id))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS children (
id INT NOT NULL,
data VARCHAR(45) NULL,
parentsId INT NOT NULL,
PRIMARY KEY (id),
INDEX fk_children_parents_idx (parentsId ASC),
CONSTRAINT fk_children_parents
FOREIGN KEY (parentsId)
REFERENCES parents (id)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB;

示例数据

parents
id data
1 foo1
2 foo2

children

id parentId data
1 1 bar1
2 2 bar3
3 2 bar3

例如,对于上述数据,删除子项 #1 应该删除父项 #1,但是,删除子项 #2 或(不和)#3 不应删除父项 #2。

我可以在三个查询中完成(1. 获取 parentsId,2. 删除子项,3. 如果没有子项则删除父项),但是,我觉得它可以/应该更好。

我在想类似下面的事情,但是,这是不正确的。

DELETE c, p FROM children c
LEFT OUTER JOIN parents p ON p.id=c.parentsId AND c.id!=123
WHERE c.id=123 AND p.id IS NULL;

如何在一个或最多两个查询中执行此操作?

最佳答案

您的三步设计没有任何问题。

此设计直接、简单且有效。没有理由怀疑它会非常低效。

有一些方法可以减少步骤,但它们都涉及“做一些复杂的事情”,因此具有更难开发和不直观的缺点。

您可能“觉得它可以/应该更好”(探索替代方案很棒),但我看不出有什么比您提议的设计更好的了(除了某些特定问题,例如 Not Acceptable 性能)。

关于mysql - 删除子 SQL 记录和父 SQL 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43913787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com