Обычный
UPSERT обновляет строку всегда, даже если данные не изменились — это лишние блокировки, WAL и autovacuum.PostgreSQL позволяет сделать условный
UPDATE прямо в ON CONFLICT:ON CONFLICT (id) DO UPDATE
...
WHERE users.email IS DISTINCT FROM EXCLUDED.email
OR users.name IS DISTINCT FROM EXCLUDED.name;
Если данные совпадают —
UPDATE не выполняется вообще.EXCLUDED — это “новая” версия строки, users.* — текущая версия в таблице.users.col IS DISTINCT FROM EXCLUDED.col
🔥 Корректно работает даже с
NULL и не попадает в ловушки трёхзначной логики.➡️ SQL Ready | #совет
