PostgreSQL 8.2 RETURNING 句

INSERT

省略可能なRETURNING句により、INSERTは実際に挿入された各行に基づいて計算された値を返すようになります。 これは、通番のシーケンス番号など、デフォルトで与えられた値を取り出す時にかなり便利です。 しかし、そのテーブルの列を使用した式を指定することができます。 RETURNINGリストの構文はSELECTの出力リストと同一です。

PostgreSQL 8.2 から更新系の SQL で RETURNING 句がサポートされていて、これによって INSERT 時に SERIAL 型で割り振られた ID を返すことが可能になってました。例えば、

INSERT INTO emp(name, age) VALUES('あめちゃん', 1) RETURNING id;

という INSERT 文は結果として

SELECT id FROM emp WHERE name='あめちゃん';

と同じ結果を返します。
他の DB では専用の関数があったりするのですが、PostgreSQL では更新系 SQL 文で一緒に結果を取得する形です。

今 Spring を使って Web アプリを作ってるんだけど、ではどうやってこの ID 値を取得すればいいのだろうと悩みました。更新系は JdbcTemplate#update() を使うけど、このメソッドの戻り値は更新された行数であって RETURNING 句の値ではない。そもそも RETURNING 句は ID だけ返すわけではなく * を指定すれば全てのカラムが返ってくる。つまり INSERT と SELECT を順に一度に実行しているようなもの。なので、結論から言うと JdbcTemplate の場合は query() メソッドを使って INSERT 文を実行すればよい。RETURNING 句で ID だけを返すのなら、queryForInt() が最適。

Last updated on August 18, 2015