Удалить строки sql, где идентификаторы не совпадают с другой таблицей

Я пытаюсь удалить сиротские записи в таблице mysql.

У меня есть 2 таблицы:

Таблица files:

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

table blob:

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

Столбцы fileid и id могут использоваться для объединения таблиц вместе.

Я хочу удалить все строки в таблице blob, где fileid не может быть найден в таблице files.id.

Итак, используя пример выше, который будет удалять строки: 3 и 4 (s) в таблице blob.

Ответ 1

Использование LEFT JOIN/IS NULL:

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

Использование NOT EXISTS:

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: Not on MyISAM), поэтому вы можете использовать откат для возврата изменений в случае возникновения проблем.

Ответ 2

DELETE FROM blob 
WHERE fileid NOT IN 
       (SELECT id 
        FROM files 
        WHERE id is NOT NULL/*This line is unlikely to be needed 
                               but using NOT IN...*/
      )

Ответ 3

DELETE FROM blob
WHERE NOT EXISTS (
    SELECT *
    FROM files
    WHERE id=blob.id
)

Ответ 4

delete from table1 t1 
    WHERE not exists (select id from table2 where related_field_in_t2=t1.id) 
    AND not exists (select id from table3 where related_field_in_t3=t1.id) 
    AND not exists (select id from table4 where related_field_t4=t1.id) 
    AND not exists (select id from table5 where related_field_t5=t1.id);