6.4. Возврат данных из изменённых строк
Иногда бывает полезно получать данные из модифицируемых строк в процессе их обработки. Это возможно с использованием предложения RETURNING
, которое можно задать для команд INSERT
, UPDATE
и DELETE
. Применение RETURNING
позволяет обойтись без дополнительного запроса к базе для сбора данных и это особенно ценно, когда как-то иначе трудно получить изменённые строки надёжным образом.
В предложении RETURNING
допускается то же содержимое, что и в выходном списке команды SELECT
(см. Раздел 7.3). Оно может содержать имена столбцов целевой таблицы команды или значения выражений с этими столбцами. Также часто применяется краткая запись RETURNING *
, выбирающая все столбцы целевой таблицы по порядку.
В команде INSERT
данные, выдаваемые в RETURNING
, образуются из строки в том виде, в каком она была вставлена. Это не очень полезно при простом добавлении, так как в результате будут получены те же данные, что были переданы клиентом. Но это может быть очень удобно при использовании вычисляемых значений по умолчанию. Например, если в таблице есть столбец serial
, в котором генерируются уникальные идентификаторы, команда RETURNING
может возвратить идентификатор, назначенный новой строке:
CREATE TABLE users (firstname text, lastname text, id serial primary key); INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;
Предложение RETURNING
также очень полезно с INSERT ... SELECT
.
В команде UPDATE
данные, выдаваемые в RETURNING
, образуются новым содержимым изменённой строки. Например:
UPDATE products SET price = price * 1.10 WHERE price <= 99.99 RETURNING name, price AS new_price;
В команде DELETE
данные, выдаваемые в RETURNING
, образуются содержимым удалённой строки. Например:
DELETE FROM products WHERE obsoletion_date = 'today' RETURNING *;
Если для целевой таблицы заданы триггеры (см. Главу 37), в RETURNING
выдаются данные из строки, изменённой триггерами. Таким образом, RETURNING
часто применяется и для того, чтобы проверить содержимое столбцов, изменяемых триггерами.