6.4. Возврат данных из измененных строк#
6.4. Возврат данных из измененных строк #
Иногда нужно получить данные из измененных строк во время их обработки. Команды INSERT
, UPDATE
и DELETE
имеют дополнительную необязательную фразу RETURNING
, которая поддерживает такой функционал. Использование RETURNING
позволяет избежать выполнения дополнительного запроса к базе данных для сбора данных и это особенно полезно, когда нет альтернативных способов точно определить измененные строки.
Допустимое содержание предложения
RETURNING
аналогично списку вывода команды SELECT
(см. Раздел 7.3). Оно может содержать имена столбцов целевой таблицы команды или выражения значений, использующие эти столбцы. Краткая запись RETURNING *
выбирает все столбцы целевой таблицы по порядку.
В команде INSERT
данные, выдаваемые в RETURNING
, берутся из строки в том виде, в каком она была вставлена. Это не очень удобно при простых вставках, так как мы просто получаем данные, предоставленные клиентом. Но это может быть очень удобно при использовании вычисляемых значений по умолчанию. Например, при использовании столбца serial
для предоставления уникальных идентификаторов, RETURNING
может вернуть ID, назначенный новой строке:
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 *;
Если на целевой таблице есть триггеры (Глава 36), то данные, доступные для RETURNING
, представляют собой строку, измененную триггерами. Таким образом, проверка вычисляемых триггерами столбцов является еще одним распространенным случаем использования RETURNING
.