Имеется таблица:
CREATE TABLE clients(
id serial PRIMARY KEY,
name varchar NOT NULL
);Когда мы вставляем в нее строку, у нас может быть потребность узнать, какой id
был присвоен новой строке в этой таблице, оператор RETERNING дает возможность
вернуть значение после операции INSERT.
INSERT INTO clients(name) VALUES('Sergio') RETURNING id;
-- Результат
-- 1001Возвращать можно любые данные, из INSERT и UPDATE и DELETE операций.
Может возникнуть необходимость получить баланс по счету после обновления данных, но если делать 2 запроса и не в одной транзакции, то из-за конкурентных параллельных изменений одной и той же записи, мы можем получить некорректные данные.
Обновляем данные
UPDATE accounts SET balance = balance - 100 WHERE id = 10;Получаем обновленные значения
SELECT balance FROM accounts WHERE id = 10;Эту проблему мы можем обойти с помощью оператора RETURNING после обновления.
UPDATE accounts SET balance = balance - 100 WHERE id = 10 RETURNING balance;DELETE FROM customers RETURNING *;
-- Результат
id | name
------+--------
1950 | Hana
2709 | Maritza
9192 | Miya
6437 | JamilВозвращать можно все значения, а не только отдельные столбцы.
... RETURNING *;