复杂的MySQL删除查询

时间:2013-09-04 10:50:16

标签: mysql sql

当前结构

SQL ERM Diagram

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

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

我的问题

  1. 我想删除一个PathType,但这很复杂 Path可能由多个PathType拥有,因此请删除 Path没有检查它有多少引用 问题。
  2. 其次,如果这个Path唯一的引用是PathType我 尝试删除然后我将删除此Path和任何 PathPoints中的记录。
  3. 最后,如果Point中没有来自任何其他记录的其他引用,那么这也需要删除,但如果其他任何对象都没有使用
  4. 尝试到目前为止

    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

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

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

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

1 个答案:

答案 0 :(得分:1)

首先,我无法在类似的查询中执行此操作,即使数据库允许它也不会这样做。这是一个无法解决的混乱。

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

相关问题