Удалить строки 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);