Gymterview
junior

Что делает оператор MERGE?

MERGE (также известный как UPSERT) — оператор, который выполняет слияние данных одной таблицы с данными другой на основе условия. Если условие истинно (строка найдена) — выполняется UPDATE, если нет — INSERT. Это атомарная операция, заменяющая комбинацию SELECT + IF EXISTS + UPDATE/INSERT.

Пример
MERGE INTO target_table t
USING source_table s
ON t.id = s.id
WHEN MATCHED THEN
    UPDATE SET t.name = s.name, t.value = s.value
WHEN NOT MATCHED THEN
    INSERT (id, name, value) VALUES (s.id, s.name, s.value);

В секции UPDATE нельзя изменять столбцы, по которым выполняется связывание (ON). Стандарт SQL:2003 определяет MERGE, но не все СУБД реализуют его одинаково. PostgreSQL до версии 15 не поддерживал MERGE и использовал альтернативный синтаксис INSERT ... ON CONFLICT:

Пример
-- PostgreSQL UPSERT (до версии 15)
INSERT INTO products (id, name, price)
VALUES (1, 'Widget', 9.99)
ON CONFLICT (id)
DO UPDATE SET name = EXCLUDED.name, price = EXCLUDED.price;

Начиная с PostgreSQL 15, полноценный MERGE поддерживается по стандарту SQL.

На собеседовании: объясните, что MERGE — это атомарный UPSERT, и упомяните ON CONFLICT как альтернативу в PostgreSQL. Частая ошибка — не знать, что в секции UPDATE нельзя менять столбцы из условия ON.