一尘不染

删除ID与另一个表不匹配的SQL行

mysql

我正在尝试删除mysql表中的孤立条目。

我有2张桌子,像这样:

files

| id | ....
------------
| 1  | ....
| 2  | ....
| 7  | ....
| 9  | ....

blob

| fileid | ....
------------
| 1  | ....
| 2  | ....
| 3  | ....
| 4  | ....
| 4  | ....
| 4  | ....
| 9  | ....

fileidid列可以被用来连接表在一起。

我想删除表blob中所有在表中fileid找不到的行files.id

因此,使用上面的示例将删除表中的行:3&4(s)blob


阅读 367

收藏
2020-05-17

共1个答案

一尘不染

使用LEFT JOIN / IS NULL:

DELETE b FROM BLOB b 
  LEFT JOIN FILES f ON f.id = b.fileid 
      WHERE f.id IS NULL

使用不存在:

DELETE FROM BLOB 
 WHERE NOT EXISTS(SELECT NULL
                    FROM FILES f
                   WHERE f.id = fileid)

使用NOT IN:

DELETE FROM BLOB
 WHERE fileid NOT IN (SELECT f.id 
                        FROM FILES f)

警告

只要有可能,就在事务中执行DELETE(假设受支持-IE:不在MyISAM上),以便在出现问题时可以使用回滚来还原更改。

2020-05-17