1

当前结构

SQL ERM 图

如您所见,路径可以被多个表和这些表中的多条记录引用。

点也可以由两个不同的表引用。

我的问题

  1. 我想删除 aPathType但是这会变得复杂,因为 aPath可能由多个人拥有,因此在不检查有多少引用的情况下PathType删除 它是不可能的。Path
  2. 其次,如果这Path唯一的参考是PathType我要删除的,那么我将要删除它Path以及PathPoints.
  3. 最后,如果任何其他记录中没有其他引用,Point则也需要删除它,但前提是它没有被任何其他对象使用。

迄今为止的尝试

DELETE PathType1.*, Path.*, PathPoints.*, Point.* FROM PathType1,Path,PathPoints,Point WHERE PathType1.ID = 1 AND PathType1.PATH = Path.ID AND (SELECT COUNT(*) FROM PathType1 WHERE PathType1.PATH = Path.ID) < 1 AND (SELECT COUNT(*) FROM PathType2 WHERE PathType2.PATH = Path.ID) = 0

显然,上面的陈述还在继续,但这不是我认为的正确方法,因为如果失败了,那么什么都不会被删除......

我认为也许不可能通过一个语句来做我正在尝试的事情,我可能必须遍历每个部分并根据结果处理它们。效率不高,但我目前看不到任何替代方案。

我希望这很清楚。如果您还有任何问题或需要任何澄清,请随时提问

4

1 回答 1

1

首先,即使数据库允许,我也不可能在这样的查询中执行此操作,而大多数情况不允许这样做。这是一个无法维护的混乱。

首选方法是创建一个事务,然后从最底部的子表开始一次从一个表中删除。然后提交事务。当然还有错误处理,所以如果一次删除无法保持数据完整性,整个事务就会被退回。如果我打算重复执行此操作,我会在存储过程中执行此操作。

于 2013-09-04T11:30:13.353 回答