RETURNING句を使って挿入IDを取得する方法 (PostgreSQLの場合)

2024-04-02

JDBCで挿入IDを取得する方法

getGeneratedKeys() メソッドを使う

これは、JDBC 3.0以降で導入された標準的な方法です。

// INSERT文を実行
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO table (name, age) VALUES ('John Doe', 30)");

// 挿入されたIDを取得
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
  int id = rs.getInt(1);
  System.out.println("挿入されたID: " + id);
}

rs.close();
stmt.close();

この方法は、すべてのデータベースでサポートされているわけではありません。

RETURNING 句を使う (PostgreSQLの場合)

PostgreSQLでは、INSERT文にRETURNING句を追加することで、挿入されたIDを取得することができます。

// INSERT文を実行
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO table (name, age) VALUES ('John Doe', 30) RETURNING id");

// 挿入されたIDを取得
ResultSet rs = stmt.getResultSet();
if (rs.next()) {
  int id = rs.getInt(1);
  System.out.println("挿入されたID: " + id);
}

rs.close();
stmt.close();

シーケンスを使う (Oracleの場合)

Oracleでは、シーケンスを使用して、挿入IDを自動生成することができます。

// シーケンスから次の値を取得
CallableStatement cstmt = connection.prepareCall("SELECT nextval FROM my_sequence");
ResultSet rs = cstmt.executeQuery();
rs.next();
int id = rs.getInt(1);

// INSERT文を実行
stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO table (name, age, id) VALUES ('John Doe', 30, " + id + ")");

rs.close();
cstmt.close();
stmt.close();

上記以外にも、データベース固有の方法で挿入IDを取得できる場合があります。詳細は、データベースのマニュアルを参照してください。

JDBCで挿入IDを取得するには、いくつかの方法があります。どの方法を使うかは、使用しているデータベースとJDBCのバージョンによって異なります。




getGeneratedKeys() メソッドを使う

import java.sql.*;

public class GetGeneratedKeys {

  public static void main(String[] args) throws Exception {
    // データベースへの接続
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");

    // INSERT文を実行
    Statement stmt = connection.createStatement();
    stmt.executeUpdate("INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]')");

    // 挿入されたIDを取得
    ResultSet rs = stmt.getGeneratedKeys();
    if (rs.next()) {
      int id = rs.getInt(1);
      System.out.println("挿入されたID: " + id);
    }

    rs.close();
    stmt.close();
    connection.close();
  }
}

RETURNING 句を使う (PostgreSQLの場合)

import java.sql.*;

public class GetGeneratedKeysWithReturning {

  public static void main(String[] args) throws Exception {
    // データベースへの接続
    Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydb", "user", "password");

    // INSERT文を実行
    Statement stmt = connection.createStatement();
    stmt.executeUpdate("INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]') RETURNING id");

    // 挿入されたIDを取得
    ResultSet rs = stmt.getResultSet();
    if (rs.next()) {
      int id = rs.getInt(1);
      System.out.println("挿入されたID: " + id);
    }

    rs.close();
    stmt.close();
    connection.close();
  }
}

シーケンスを使う (Oracleの場合)

import java.sql.*;

public class GetGeneratedKeysWithSequence {

  public static void main(String[] args) throws Exception {
    // データベースへの接続
    Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/mydb", "user", "password");

    // シーケンスから次の値を取得
    CallableStatement cstmt = connection.prepareCall("SELECT nextval FROM my_sequence");
    ResultSet rs = cstmt.executeQuery();
    rs.next();
    int id = rs.getInt(1);

    // INSERT文を実行
    Statement stmt = connection.createStatement();
    stmt.executeUpdate("INSERT INTO users (name, email, id) VALUES ('John Doe', '[email protected]', " + id + ")");

    rs.close();
    cstmt.close();
    stmt.close();
    connection.close();
  }
}




他の方法

MySQL

  • LAST_INSERT_ID() 関数を使う
// INSERT文を実行
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]')");

// 挿入されたIDを取得
int id = stmt.getGeneratedKeys();

System.out.println("挿入されたID: " + id);

stmt.close();

PostgreSQL

  • OID 列を使う
// INSERT文を実行
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]')");

// 挿入されたIDを取得
ResultSet rs = stmt.executeQuery("SELECT oid FROM users WHERE name = 'John Doe'");
if (rs.next()) {
  int id = rs.getInt(1);
  System.out.println("挿入されたID: " + id);
}

rs.close();
stmt.close();
// INSERT文を実行
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]')");

// 挿入されたIDを取得
ResultSet rs = stmt.executeQuery("SELECT ROWID FROM users WHERE name = 'John Doe'");
if (rs.next()) {
  String rowid = rs.getString(1);
  System.out.println("挿入されたID: " + rowid);
}

rs.close();
stmt.close();

java sql jdbc


T-SQL Unit Testing: SQLコードの品質を向上させるためのテスト手法

SQL選択リストでは、列名だけでなく、ブール式を記述することができます。これは、特定の条件に基づいて値を真または偽として評価し、結果セットに含めるかどうかを決定するために使用されます。使用例CASE式: 特定の条件に基づいて異なる値を返す論理演算子: 複数の条件を組み合わせて評価...


意外と知らない?SQLにおける一重引用符と二重引用符の使い分け

文字列リテラルを厳密に解釈します。特殊文字はエスケープする必要があります。例:多くの特殊文字をそのまま使用できます。一般的には、一重引用符を使用することを推奨します。これは、一重引用符の方が厳密な解釈を行うため、意図しない結果を防ぐことができるからです。...


Natural JoinとInner Join: データベース操作の効率化と可読性を高めるためのヒント

概要SQLにおけるNatural JoinとInner Joinは、複数のテーブルを結合する際に使用される重要な操作です。どちらも共通の列に基づいてテーブルを結合しますが、いくつかの重要な違いがあります。Natural Joinは、共通の列名とデータ型を持つすべての列に基づいて2つのテーブルを結合する操作です。つまり、結合条件を明示的に指定する必要がなく、より簡潔な記述が可能となります。...


【保存版】Hibernateでエンティティクラスとマッピングファイルを正しく記述して「Unable to instantiate default tuplizer」エラーを防ぐ

「Unable to instantiate default tuplizer」エラーは、Java、データベース、Hibernateを使用するアプリケーションで発生する一般的なエラーです。このエラーは、Hibernateがエンティティクラスのプロパティに対応するgetter/setterメソッドを見つけられない場合に発生します。...


初心者でも安心!Android アプリで発生するSQLiteConnection オブジェクトのリークを防ぎ、安全な開発を

Android アプリケーションで SQLite データベースを使用する場合、SQLiteConnection オブジェクトのリーク は深刻な問題となります。これは、データベースへの接続が閉じられずに残ってしまう状況を指し、以下の問題を引き起こします。...


SQL SQL SQL SQL Amazon で見る



pgjdbcドライバを使用してJavaでPostgreSQLデータベースから最後に挿入された行のIDを取得する方法

INSERTステートメントにRETURNING句を使用すると、挿入された行の値を結果セットとして取得できます。PostgreSQLでは、シーケンスを使用して、挿入される行のIDを自動的に生成することができます。LASTVAL()関数は、最後に挿入された行のIDを取得するために使用できます。