Я пытаюсь удалить потерянные записи в таблице MySQL.
У меня есть 2 таблицы, как это:
Таблица files
:
| id | ....
------------
| 1 | ....
| 2 | ....
| 7 | ....
| 9 | ....
стол blob
:
| fileid | ....
------------
| 1 | ....
| 2 | ....
| 3 | ....
| 4 | ....
| 4 | ....
| 4 | ....
| 9 | ....
fileid
И id
столбцы могут быть использованы для объединения таблиц вместе.
Я хочу , чтобы удалить все строки в таблице , blob
где fileid
не могут быть найдены в таблице files.id
.
Поэтому, используя приведенный выше пример, мы удалили строки: 3 и 4 в blob
таблице.
null
s.Ответы:
Использование LEFT JOIN / IS NULL:
Использование НЕ СУЩЕСТВУЕТ:
Использование NOT IN:
Предупреждение
По возможности выполняйте УДАЛЕНИЯ внутри транзакции (при условии, что поддерживается - IE: не в MyISAM), чтобы вы могли использовать откат для отмены изменений в случае возникновения проблем.
источник
fileid
это не-обнуляемым . Кроме того, третье решение (NOT IN
) требует только, чтобы этоf.id
не обнулялось. Предположительно, это первичный ключ, так и будет.источник
NOT IN (NULL)
возвращает пустой набор результатов, поэтому значения NULL должны быть исключены. Ноid
колонка, вероятно, в любом случае не будет обнуляемой, поэтому «вряд ли понадобится»not in(null)
довольно логично, почему не работает? Что за этим стоит?unknown
и что-либо являетсяfalse
или,unknown
и никогда не может оцениватьсяtrue
источник
files.id
иblob.fileid
. Я предполагаю, что ваш запрос приведет к ошибке.источник
NOT EXISTS
была опубликована 9 лет назад. 4. Вы не продвинули лучшую практику последовательного использования заглавных букв для ключевых слов MySQL. Другими словами, здесь ничего не стоит хранить, поэтому я также проголосовал за удаление этого поста.