Сверка миграции через NOT IN вернула ноль расхождений, хотя данные потерялись
После переноса клиентов в новую систему вы проверяете, все ли клиенты доехали:
SELECT id
FROM clients_old
WHERE id NOT IN (SELECT client_id FROM clients_new);
Запрос возвращает 0 строк, и вы докладываете, что миграция прошла без потерь. Через неделю поддержка находит клиентов, которых нет в новой системе. Известно, что в clients_new у части служебных записей поле client_id не заполнено (NULL).
Что произошло?
- Подзапрос выполнился до завершения миграции, поэтому сравнение шло с неактуальным набором данных
- NOT IN сравнивает значения по типам, а id в старой и новой системе имеют разные типы, из-за чего сравнение отбрасывается
- NOT IN сравнивает только первые совпавшие значения подзапроса, поэтому проверка неполная
- Из-за NULL в подзапросе условие NOT IN ни для одной строки не становится истинным, и запрос всегда возвращает пусто
