Возврат данных из измененных строк

Иногда полезно получить данные из измененных строк, когда ими манипулируют. Все команды INSERT, UPDATE и DELETE имеют необязательное предложение RETURNING, для поддержки этой возможности. Использование RETURNING позволяет избежать выполнения дополнительного запроса к базе данных для сбора данных и является особенно ценным - в противном случае было бы трудно надежно идентифицировать измененные строки.

Разрешенное содержимое предложения RETURNING совпадает с выходным списком команды SELECT (см. раздел Списки выборки). Он может содержать имена столбцов целевой таблицы команды или выражения значений, использующие эти столбцы. Обычным сокращением является 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 *;

Если в целевой таблице есть триггеры (глава Триггеры), данные, доступные для RETURNING — это строка, измененная триггерами. Таким образом, проверка столбцов, вычисленных триггерами, является еще одним распространенным вариантом использования RETURNING.