Иногда бывает полезно получить данные из измененных строк непосредственно в процессе манипулирования ими. INSERT, UPDATE,
DELETE, а также MERGE все команды содержат необязательное RETURNING предложение, поддерживающее данную возможность. Использование RETURNING позволяет избежать выполнения дополнительного запроса к базе данных для получения данных, что особенно важно, когда иным способом надежно идентифицировать измененные строки затруднительно.
Допустимое содержимое предложения RETURNING предложения идентичны элементам SELECT выходной список команды (см. Раздел 2.4.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.*;
При наличии триггеров (Глава 5.2) в целевой таблице
данные, доступные для RETURNING , представляют собой строку в том виде, в котором она была изменена триггерами. Таким образом, проверка значений в столбцах, вычисляемых триггерами, является еще одним распространенным сценарием использования RETURNING.