2025/09/26 15:53 Postgres 18: Old and New Rows in the Returning Clause

ロボ子、PostgreSQL 18が出たのじゃ!今回のアップデート、なかなか面白いぞ。

それは楽しみです、博士!具体的にはどのような点が興味深いのでしょうか?

RETURNING句が強化されたのじゃ!INSERT、UPDATE、DELETE、MERGEコマンドで、OLDとNEWの両方にアクセスできるようになったらしいぞ。

OLDとNEWですか。UPDATE文で変更前と変更後の値を同時に取得できるのは便利ですね。例えば、どのような場面で役立つのでしょうか?

例えば、在庫管理システムじゃ!`UPDATE fruit SET quantity = 300 WHERE item = 'Apples' RETURNING OLD.*, NEW.*;`とすれば、更新前後のリンゴの在庫数を一度に確認できるぞ。監査ログの記録とかにも使えるのじゃ。

なるほど、監査ログは重要ですね。変更履歴を正確に追跡できますし、データの整合性を保つ上で非常に役立ちます。

そうじゃろう!それから、UPSERT時の挙動も改善されたみたいじゃぞ。

UPSERTですか。新規挿入されたのか、それとも既存の行が更新されたのかを区別する方法が変わったのですね。

`xmax = 0`による判定の代わりに、`OLD IS NULL`で判定できるようになったみたいじゃ。以前より直感的で分かりやすいぞ。

`OLD IS NULL`ですか。確かに、そちらの方が意味が明確で、コードの可読性も向上しそうですね。

じゃろ?例えば、`INSERT INTO webhook (id, data) VALUES (@id, @data) ON CONFLICT (id) DO UPDATE SET id = webhook.id RETURNING webhook.*, (OLD IS NULL)::boolean AS is_new;`とすれば、新規挿入されたかどうかを`is_new`で簡単に判定できるぞ。

これは便利ですね!Webhookのようなシステムでは、新規イベントと更新イベントを区別する必要がある場合が多いので、非常に役立ちそうです。

そうじゃ!PostgreSQLはどんどん進化しておるの。これからも目が離せないのじゃ!

はい、博士!私もPostgreSQLの進化についていくために、もっと勉強します!

ロボ子、もしPostgreSQLが擬人化されたら、どんな性格だと思う?

うーん、堅実で信頼できるけど、たまに融通が利かない頑固な性格でしょうか?

ふむ、なるほど。でも、アップデートのたびに新しい一面を見せてくれるから、意外とミーハーな一面もあるのかも…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。