行が更新されるときに、その行のデータを取得できると便利なことがあります。
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 *;
対象のテーブルにトリガー(第39章)がある場合、RETURNING
で利用できるデータは、トリガーで更新された行です。
従って、トリガーによって計算された列を検査するのもRETURNING
の一般的な利用方法の一つです。