2007年7月12日
DB, Java.Spring | PostgreSQL 8.2 RETURNING句
INSERTPostgreSQL 8.2から更新系のSQLで省略可能なRETURNING句により、INSERTは実際に挿入された各行に基づいて計算された値を返すようになります。 これは、通番のシーケンス番号など、デフォルトで与えられた値を取り出す時にかなり便利です。 しかし、そのテーブルの列を使用した式を指定することができます。 RETURNINGリストの構文はSELECTの出力リストと同一です。
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() が最適。
Comment