我希望删除给定id的子项,如果删除子项后子项的父项不再有子项,也删除父项。 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;
如何在一个或最多两个查询中执行此操作?
答案 0 :(得分:2)
您的三步设计没有任何问题。
这种设计简单,简单,有效。没有理由怀疑它会非常低效。
有很多方法可以用更少的步骤来完成它,但它们都涉及做“复杂的事情”,因此具有难以开发和不太直观的缺点。
你可能“感觉它可以/应该更好”(而且探索替代方案很棒),但我没有看到比你提出的设计更好的东西(没有一些特定的问题,比如不可接受的性能)。