Многие после
UPDATE делают отдельный SELECT, чтобы получить изменённые данные.Но PostgreSQL уже умеет вернуть результат изменения через
RETURNING.UPDATE orders
SET status = 'paid',
paid_at = now()
WHERE id = 1001
RETURNING id, status, paid_at;
Один запрос вместо двух.
RETURNING можно сразу передавать дальше.Например, обновили заказ и сразу записали историю изменения:
WITH changed AS (
UPDATE orders
SET status = 'cancelled'
WHERE id = 1001
RETURNING id, status
)
INSERT INTO order_history(order_id, new_status)
SELECT id, status
FROM changed;
Без промежуточных переменных и без повторного поиска строки.
Также можно использовать это для атомарного переноса данных:
WITH moved AS (
DELETE FROM queue
WHERE id = 55
RETURNING *
)
INSERT INTO archive_queue
SELECT *
FROM moved;
🔥 Получается "забрать строку и положить в другую таблицу" одной транзакционной операцией. Часто заменяет сложный код в сервисах и убирает лишние запросы к базе.
➡️ SQL Ready | #совет
