Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Postgres 18: OLD and NEW Rows in the RETURNING Clause

2025年09月26日に「Reddit /r/programming」が公開したITニュース「Postgres 18: OLD and NEW Rows in the RETURNING Clause」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

データベース管理システムPostgresのバージョン18で、SQLのRETURNING句が強化された。データの更新や削除の際、変更前のデータ(OLD)と変更後のデータ(NEW)を同時に取得可能になった。これにより、データベース操作の履歴管理やデータ検証がより効率的に行えるようになる。

ITニュース解説

システムエンジニアを目指す上で、データベースの知識は不可欠だ。その中でもPostgres(PostgreSQL)は非常に人気が高く、信頼性の高いリレーショナルデータベース管理システムとして広く利用されている。Postgresの最新バージョンであるPostgres 18で導入される新機能の一つに、「RETURNING句におけるOLDとNEWの利用」がある。これは、データベースのデータを変更した際に、その変更前と変更後の状態を一度に取得できる機能で、システム開発において非常に強力なツールとなる。

まず、データベースとは、大量のデータを効率的に保存し、検索、更新、削除といった操作を可能にするシステムのことを指す。Postgresのようなリレーショナルデータベースでは、データはテーブル(表)という形式で管理され、それぞれのテーブルは行と列で構成されている。これらのデータを操作するための標準的な言語がSQL(Structured Query Language)だ。

SQLには、データを操作するためのDML(Data Manipulation Language)と呼ばれる命令群がある。具体的には、新しいデータを追加するINSERT文、既存のデータを変更するUPDATE文、そしてデータを削除するDELETE文がある。

ここで「RETURNING句」というものが登場する。Postgresを含む多くのリレーショナルデータベースでは、INSERT、UPDATE、DELETEといったDML文を実行した際に、単に成功したか失敗したかだけでなく、その操作によって実際にどのようなデータが変更されたのかを取得できる機能が提供されている。これがRETURNING句だ。例えば、INSERT文で新しいユーザー情報をデータベースに追加した際、そのユーザーに自動で割り当てられたID(主キー)をすぐに取得したい場合や、UPDATE文で商品の価格を変更した後に新しい価格をすぐに知りたい場合などにRETURNING句は非常に便利だった。これにより、データベースへのアクセス回数を減らし、アプリケーションの処理を効率化できた。

しかし、これまでのRETURNING句には一つの制限があった。それは、UPDATE文やDELETE文を実行した際に、変更後のデータ(UPDATEの場合)や削除されたデータ(DELETEの場合)は取得できるが、変更「前」のデータは直接取得できなかったという点だ。もし変更前の状態と変更後の状態の両方を比較したい場合、開発者は通常、DML文を実行する前に一度データをSELECT文で取得し、その後でDML文を実行するという二段階の操作が必要だった。あるいは、データベースのトリガー機能を使うなど、より複雑な方法を用いる必要があった。これは、コードを複雑にし、場合によってはパフォーマンスの低下や、複数の操作間にデータの不整合が生じるリスクもはらんでいた。

Postgres 18で導入される「RETURNING句におけるOLDとNEWの利用」は、この課題を根本的に解決する。この新機能により、UPDATE文やDELETE文でデータが変更される際、RETURNING句の中で「OLD.」や「NEW.」といったキーワードを指定できるようになる。

「OLD.」は、DML文が実行される「前」の、対象となる行の全カラムのデータを指す。つまり、データが更新される直前、または削除される直前の状態を意味する。一方、「NEW.」は、DML文が実行された「後」の、対象となる行の全カラムのデータを指す。UPDATE文であれば更新後のデータ、INSERT文であれば挿入後のデータ、DELETE文であれば(RETURNING句においては意味のある変更後データがないため通常はNULLとなるが、トリガーなどでは削除後の状態を示すことがある)といった形で利用される。

この機能の最大のメリットは、単一のSQL文でデータの変更と、その変更前後の状態の両方をアトミック(不可分)に取得できる点にある。例えば、ユーザーのステータスを「保留中」から「承認済み」に変更する際に、変更前のステータスが「保留中」であったことと、変更後のステータスが「承認済み」になったことを、一つのUPDATE文で同時に把握できる。

具体的な利用シーンをいくつか紹介しよう。

一つ目は「監査ログ」の記録だ。システムの重要なデータが変更された際に、誰が、いつ、どのように変更したのか、そして変更前と変更後の値がどうだったのかを記録することは、セキュリティやコンプライアンスの観点から非常に重要だ。この新機能を使えば、UPDATE文やDELETE文を実行するたびに、RETURNING句でOLDとNEWの値を同時に取得し、それを監査ログテーブルに挿入する、といった処理を非常に簡潔に記述できる。これにより、監査ログの信頼性が向上し、ログ漏れの可能性も低減する。

二つ目は「キャッシュの更新」だ。アプリケーションでは、データベースへのアクセス頻度を減らすために、よく使われるデータをメモリ上に一時的に保持する「キャッシュ」という仕組みが使われることがある。データベースのデータが変更された場合、キャッシュもそれに合わせて更新する必要がある。この機能を使えば、データベースの更新と同時に、変更されたデータ(NEW)だけでなく、変更前のデータ(OLD)も取得できるため、キャッシュの無効化や更新処理をより正確かつ効率的に行えるようになる。例えば、変更前のIDを使ってキャッシュから古いデータを削除し、変更後のデータで新しいキャッシュを生成するといった処理が可能だ。

三つ目は「イベント通知」だ。システム内で特定のデータが変更された際に、他のサービスやユーザーにその変更を通知する必要がある場合がある。例えば、商品の在庫数が特定のしきい値を下回った場合に担当者にアラートを送るといったケースだ。RETURNING句でOLDとNEWの在庫数を同時に取得することで、在庫が減少したのか、それとも増加したのか、そして具体的な変動幅までを一つのクエリで把握でき、その情報に基づいて適切な通知を迅速に発することが可能になる。

これらの例からわかるように、Postgres 18のRETURNING句におけるOLDとNEWの導入は、システム開発の効率性、データの整合性、そしてアプリケーションのパフォーマンスと信頼性を大幅に向上させる可能性を秘めている。システムエンジニアを目指す皆さんにとって、このようなデータベースの新機能は、今後の開発において非常に役立つ知識となるだろう。複雑なビジネスロジックをよりシンプルに、そして堅牢に実装するための強力な手段として、ぜひ理解し活用していくべき機能だ。データベースの進化は止まることなく、常に新しい技術が導入され、開発の可能性を広げている。

関連コンテンツ

関連IT用語