Что делает оператор 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.