【PostgreSQL】INSERT時に自動生成されたIDを取得する方法(RETURNING句)

※ この記事にはアフィリエイトリンクが含まれます

PostgreSQLでは、テーブルの主キーとして自動採番されるIDを利用するケースが多くあります。

例えば、ユーザー登録や注文データなどではSERIALIDENTITY を使ってIDを自動生成するのが一般的です。

しかし、アプリケーション開発をしていると、下記のような場面でINSERT後に生成されたIDを取得したいことがあります。

  • 親テーブルを登録して、そのIDを子テーブルに登録する
  • APIで登録結果としてIDを返す
  • 登録直後のデータを別処理で利用する

このような場合、PostgreSQLではRETURNING句を使うことで、INSERT時に生成されたIDを簡単に取得できます。

この記事では、PostgreSQLでINSERT時に自動生成されたIDを取得する方法を、SQLの具体例を交えて分かりやすく解説します。

目次

INSERT時にIDを取得する方法(結論)

PostgreSQLでは、INSERT 文にRETURNING句を追加することで、登録した行の値を取得できます。

例えば、次のSQLを見てみましょう。

INSERT INTO users (name)
VALUES ('Taro')
RETURNING id;

このSQLを実行すると、データがINSERTされると同時に生成されたidの値が結果として返されます。

実行結果のイメージが次のとおりです。

 id
----
 1

このように、INSERTと同時に登録結果を取得できるため、アプリケーション開発でもよく使われる便利な方法です。

RETURNING句の基本的な使い方

ここからは、RETURNING 句の基本的な使い方を具体的に見ていきましょう。

IDだけを取得する

最もよく使われるのは、自動生成されたIDだけを取得する方法です。

INSERT INTO users (name)
VALUES ('Taro')
RETURNING id;

実行結果

 id
----
 1

このように、RETURNING id を指定することで、INSERTされた行のidカラムの値を取得できます。

親テーブルを登録したあとに、そのIDを使って子テーブルを登録する場合などによく利用されます。

複数カラムを取得する

RETURNING 句では、ID以外のカラムも同時に取得することができます。

INSERT INTO users (name)
VALUES ('Taro')
RETURNING id, name;

このSQLを実行すると、次のような結果が返されます。

 id | name
----+------
 1  | Taro

このように、RETURNING 句ではSELECT文と同じ感覚で取得するカラムを指定できます。

INSERTしたデータをそのまま取得する

INSERTした行のすべてのカラムを取得したい場合は、RETURNING * を使用します。

INSERT INTO users (name)
VALUES ('Taro')
RETURNING *;

実行結果

 id | name
----+------
 1  | Taro

RETURNING * を使うと、INSERTされた行の内容をそのまま取得することができます。

例えば次のようなケースです。

  • 登録結果をそのままAPIレスポンスにする
  • 登録内容をログに出力する
  • アプリ側で登録結果を確認する

INSERT直後のデータを取得したい場合は、RETURNING * を覚えておくと便利です。

複数行INSERTの場合

RETURNING 句は複数行INSERTの場合でも使用可能です。

例えば次のようなSQLです。

INSERT INTO users (name)
VALUES
('Taro'),
('Jiro')
RETURNING id;

実行結果

 id
----
 1
 2

このように、複数業をINSERTした場合は、INSERTされた行の分だけ結果が返ります。

そのため、アプリケーション側では複数レコードとして取得する必要がある点に注意しましょう。

アプリケーションからIDを取得する例

ここでは、実際のアプリケーションからRETURNING を利用してIDを取得する例を紹介します。

PHP (PDO)

PHPのPDOを使用する場合は、RETURNING 句を使ったSQLを実行し、結果を取得します。

$sql = "INSERT INTO users(name) VALUES(:name) RETURNING id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['name' => 'Taro']);

$id = $stmt->fetchColumn();

fetchColumn() を使うことで、RETURNING で取得したIDを簡単に取得することができます。

Laravel

Laravelでは、insertGetId() を使うことで、INSERTと同時にIDを取得できます。

$id = DB::table('users')->insertGetId([
    'name' => 'Taro'
]);

このメソッドは内部的にPostgreSQLのRETURNING句を利用してIDを取得しています。

そのため、Laravelを使っている場合は、こちらの方法を使うのが一般的です。

まとめ

PostgreSQLでINSERT時に自動生成されたIDを取得する場合は、RETURNING句を使用します。

ポイントを整理すると次の通りです。

  • RETURNING id を使うと自動生成されたIDを取得できる
  • RETURNING id, name のように複数カラムも取得できる
  • RETURNING * を使うとINSERTした行をそのまま取得できる
  • 複数行INSERTでも利用可能

PostgreSQLでアプリケーション開発を行う場合、INSERT後の処理でIDを使うケースは非常に多いため、RETURNING 句はぜひ覚えておきたい機能のひとつです。

PostgreSQLは、現場でも広く使われている信頼性の高いデータベースです。
もしこれから本格的に学び、実務で通用する力をつけたい方には、RareTECHをチェックしてみてください。
実案件ベースのカリキュラムで、あなたのスキルを次のステージへ引き上げてくれるはずです。


なんくる

「本当にエンジニアとしてやっていけるか不安…」という方も、実践的な開発に関わることで、転職後の働き方を事前に体感できますよ。

実務で使えるDBスキルとともに、プログラミングスキルをちゃんと身につけたいなら、
RareTECH無料カウンセリングで、学ぶ目的やゴールをプロと一緒に明確にしてみましょう。独学では得られない「実践的な成長の道筋」が見えてきます。


もしこの内容を通して、PostgreSQLについてさらに理解を深めたいと感じられたなら、信頼できる講座や書籍を紹介した別記事をご覧いただくのも良いかと思います。ご自身の学びに、きっとお役立ていただけるはずです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

沖縄出身のエンジニアです。IT業界で5年以上の経験があり、主にC#やPHPを使って開発を行ってきました。新しい技術にも興味があり、日々学びながらスキルアップを目指しています。

コメント

コメントする

CAPTCHA


目次