mysql删除父级不存在的行

时间:2013-06-13 09:39:54

标签: mysql

我有一个名为items的表,其中包含“itemID”和“parentID”,其中parentID是表中另一行的ID。我想删除不再存在parentID-row的行。

这就是我提出的:

DELETE FROM items
WHERE (SELECT COUNT(1)
       FROM items as parent
       WHERE items.parentID=parent.itemID)=0

但是我收到以下错误:您无法在FROM子句

中为更新指定目标表'items'

编辑:如果查询也会删除链接到此查询删除的项目的项目,这样可以在sql中进行,还是应该对其进行编码?

3 个答案:

答案 0 :(得分:7)

使用子查询是无效的;使用multiple-table syntax的左连接:

DELETE items 
FROM items
    left join items as parent 
        on items.parentID = parent.itemID
WHERE parent.itemID is NULL

多表语法允许您在删除命令中指定连接 - 因此您可以连接多个表并仅从一个表中删除。即DELETE t1 FROM t1 join t2 ....将加入t1t2,但只会删除表t1中的相应行。

至于你的问题“如果查询删除链接到此查询删除的项目的项目会很好,这在sql中是否可行,或者我应该编码吗?”

我认为最终会出现级联 - 删除的记录可能是另一条记录的父级,所以也删除那条记录,但是那条记录也可能是另一条记录的父级,所以你也需要删除它等等。我认为不可能通过单个SQL查询来查询所有这个级联。

所以我认为最简单的解决方案是重新运行上述查询,直到没有删除任何行。

答案 1 :(得分:3)

查询将是

DELETE items FROM items 
left join parent 
    on items.parentID = parent.ID
WHERE parent.ID is NULL

答案 2 :(得分:0)

试试这个小巫术......

delete from FooTable f1 where f1.parent_id 
         not in (select f2.item_id from FooTable f2);

当然这个查询有一个小问题,如果你很敏锐,你可能已经注意到,它可能会生成没有父级的新FooRecords(这样,它们的父级可能会在查询执行期间被删除)。

如果您不需要自动化的东西,请手动执行多次查询,或将其置于循环内,并在删除的记录数为0时停止循环。