Короткий ответ
RETURNING позволяет получить значения изменённых (или вставленных/удалённых) строк в одном запросе вместе с самой операцией изменения, без отдельного round-trip на SELECT, и без риска, что между UPDATE и последующим SELECT другая транзакция успеет снова изменить эти же строки.
Как это работает подробнее
RETURNING добавляется к INSERT/UPDATE/DELETE и возвращает результирующий набор строк так же, как обычный SELECT, но строки берутся непосредственно из только что изменённых версий — одна атомарная операция клиент-сервер.
Пример кода
example.sql
UPDATE accounts
SET balance = balance - 100
WHERE id = 1 AND balance >= 100
RETURNING id, balance;
-- Если строки не было (например, balance < 100), запрос вернёт 0 строк —
-- это сразу и результат проверки условия, и получение нового значения одним запросомЧто использовать на практике
- Практика. Удобно применять, когда нужно сразу получить вычисленное на стороне БД значение (например, обновлённый balance после F("balance") - amount) или id после INSERT, без дополнительного запроса; это также устраняет гонку между UPDATE и следующим SELECT.
Подводные камни
- Ошибка. Продолжают писать UPDATE, а затем отдельный SELECT для получения результата по тому же условию — лишний round-trip и потенциальная рассинхронизация, если между запросами произошло ещё одно изменение той же строки.