6.4. Возврат данных из измененных строк#
6.4. Возврат данных из измененных строк #
Иногда бывает полезно получить данные из измененных строк, пока они
обрабатываются. Команды INSERT
, UPDATE
,
DELETE
и MERGE
все имеют
необязательное предложение 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 *;
В MERGE
данные, доступные для RETURNING
, это
содержимое исходной строки плюс содержимое вставленной, обновленной или
удаленной целевой строки. Поскольку довольно часто исходные и целевые данные
имеют много одинаковых столбцов, указание RETURNING *
может привести к множеству дублированных столбцов, поэтому часто более полезно
квалифицировать его, чтобы вернуть только исходную или целевую строку. Например:
MERGE INTO products p USING new_products n ON p.product_no = n.product_no WHEN NOT MATCHED THEN INSERT VALUES (n.product_no, n.name, n.price) WHEN MATCHED THEN UPDATE SET name = n.name, price = n.price RETURNING p.*;
Если на целевой таблице есть триггеры (Глава 36), то данные, доступные для RETURNING
, представляют собой строку, измененную триггерами. Таким образом, проверка вычисляемых триггерами столбцов является еще одним распространенным случаем использования RETURNING
.