删除子记录和父SQL记录

时间:2017-05-11 11:13:24

标签: mysql sql foreign-keys

我希望删除给定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;

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

1 个答案:

答案 0 :(得分:2)

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

这种设计简单,简单,有效。没有理由怀疑它会非常低效。

有很多方法可以用更少的步骤来完成它,但它们都涉及做“复杂的事情”,因此具有难以开发和不太直观的缺点。

你可能“感觉它可以/应该更好”(而且探索替代方案很棒),但我没有看到比你提出的设计更好的东西(没有一些特定的问题,比如不可接受的性能)。