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

Jam*_*son 3 mysql sql sql-delete

我有两张桌子:

listings(item_id, ...)
images(item_id,  ...)
Run Code Online (Sandbox Code Playgroud)

两个表中的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)
Run Code Online (Sandbox Code Playgroud)

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

Rub*_*ben 9

您应该使用子查询

DELETE FROM images WHERE item_id NOT IN(SELECT item_id FROM listings)
Run Code Online (Sandbox Code Playgroud)

更多例子和解释.


Pau*_*sik 7

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

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

SELECT * 
-- DELETE
FROM images WHERE item_id NOT IN (SELECT item_id FROM listings) 
Run Code Online (Sandbox Code Playgroud)

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