PostgreSQL UPDATE FROM RETURNING: обновить по соответствию

Категория: Postgresql · Язык: SQL · Обновлено:

UPDATE ... FROM связывает таблицу с источником новых значений, а RETURNING выдаёт строки, которые действительно изменились. Это удобнее последовательных UPDATE для пачки связанных записей.

Рабочий пример

SQL
CREATE TEMP TABLE products(id int, price int);
INSERT INTO products VALUES (1, 100), (2, 200);
WITH changes(id, price) AS (VALUES (1, 120), (2, 220))
UPDATE products AS p
SET price = changes.price
FROM changes
WHERE p.id = changes.id
RETURNING p.id, p.price;

Источник должен содержать не больше одной строки на целевую запись. Если несколько source rows совпадут с одним target, выбранное значение может быть непредсказуемым.

Частый вопрос

Можно ли вернуть старое и новое значение?

В поддерживаемых версиях PostgreSQL используйте RETURNING old.column и new.column. Проверьте синтаксис целевой версии; иначе сохраните старые данные отдельным CTE или запросом.