Отличие SQL Merge от Upsert
Облако напомнило, что пора бы обновить Postgres, потому что используемая версия (14) невероятно устарела. Я осознал, что мои знания о функциональности в новых версиях остановились где-то в районе 10 версии (работает и ладно же), а сейчас уже скоро будет 18, решил почитать, что нового там появилось.
Среди кучи улучшений производительность и новых фич, которые я вряд ли использую, с удивлением обнаружил, что в 15 версии добавили MERGE
. Оказывается, эта команда так вообще часть стандарта SQL, причем достаточно старого, 2003. При этом проблема upsert в Postgres издревле решалась через INSERT ... ON CONFLICT ...
.
Нюанс в том, что MERGE
решает немного другие проблемы, чем upsert. MERGE
лучше предназначен для пакетных операций, и при параллельных транзакциях все равно может быть проблема, ON CONFLICT
надежнее в этом плане, поскольку он атомарный.
Вроде полезно релиз-ноты читать, но у устоявшихся технологий мало что революционного происходит.
А еще SQL стандарт развивается. Теперь там еще и JSON есть, в 2023.