過去、以下2つを投稿しましたが、
PostgreSQL で mySQL の last_insert_id() 相当をmybatis で実装したい - Oboe吹きプログラマの黙示録
PostgresSQL アップサートのインクリメント - Oboe吹きプログラマの黙示録
そもそも、PostgreSQL の RETURNING は、INSERT 、UPDATE 、DELETE 実行した時
対象行を返す句を書くもの。
INSERT/UPDATE/DELETE が成立しなかった時は、SELECT結果が無いときと同じある。
以下のように使い方を整理できる。
・INSERT ~ RETURNING ⇒ serial型カラムや、gen_random_uuid() で作成した UUID型のカラムを参照
・UPDATE ~RETURNING ⇒ 更新行の更新後のカラムなどを参照
・DELETE FROM ~RETURNING ⇒ 削除したレコードを参照
RETURNING は、SELECT句で書いていたことと同じものが書けるので、
極端に言えば、’*’ を書いて対象レコード全カラムを参照できる。
UPDATE tablename1 SET work_status = 1 WHERE id > 12 RETURNING *
こう書ける。
更新対象のレコード全てを返すのだから、
id > 12 のレコードの work_status を1にしたレコード全てを検索結果として返してくれる。
テーブルのカラム以外の関数もRETURNING句で書いたっていい。
UPDATE tablename1 SET work_status = 1 WHERE id > 12 RETURNING id, name, CONCAT(name, '.xlsx') AS filename, NOW() AS ctime
UPDATE ~ WHERE ~ RETURNING は、処理したいレコードを
更新=マーキングして対象レコードをSELECT結果として求めるのに
有効な方法になる。