两个表 - 如果两个表中未引用ID,如何删除行

时间:2011-04-29 17:58:58

标签: mysql sql sql-delete

我有两张桌子:

listings(item_id, ...)
images(item_id,  ...)

两个表中的item_id值相同 - 但是我从'listing'表中删除并删除了列表,而没有删除'images'表中的相应行。

所以 - 我想删除第二个'images'表中的所有行,如果IMAGES中的item_id与我的主'listing'表中的任何更新的item_id值不对应。

如何删除'images'表中未从'listing'引用的所有记录?

我一直在试验SQL脚本和子查询,如下所示:

DELETE FROM images WHERE item_id IN
(SELECT item_id FROM images EXCEPT SELECT item_id FROM listings)

但在我搞砸之前,想确认这是否正确?

4 个答案:

答案 0 :(得分:9)

您应该使用子查询

DELETE FROM images WHERE item_id NOT IN(SELECT item_id FROM listings)

更多examples and explanation

答案 1 :(得分:7)

这是处理这些微妙情况的好方法:

在运行查询之前,如果未正确写入可能会造成重大损害,请使用SELECT替换DELETE / UPDATE以查看查询将影响哪些行。在你的情况下,它将是:

SELECT * 
-- DELETE
FROM images WHERE item_id NOT IN (SELECT item_id FROM listings) 

当然,您还希望在发出此类命令之前通过备份数据库来覆盖自己。即使您的查询在SELECT测试中看起来正确,您也永远不会知道......

答案 2 :(得分:4)

这样可行,或IN条款。

DELETE
FROM image
WHERE item_id NOT IN (SELECT item_id FROM listings)

答案 3 :(得分:1)

对我而言,更清楚地说

DELETE FROM images WHERE item_id NOT IN 
    (SELECT item_id FROM listings)