pgjdbcドライバを使用してJavaでPostgreSQLデータベースから最後に挿入された行のIDを取得する方法
JavaでPostgreSQLデータベースから最後に挿入された行の値を取得する方法
RETURNING句を使用する
INSERT
ステートメントにRETURNING
句を使用すると、挿入された行の値を結果セットとして取得できます。
// 新しいレコードを挿入
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
statement.setString(1, "John Doe");
statement.setString(2, "[email protected]");
statement.executeUpdate();
// 最後に挿入された行のIDを取得
ResultSet resultSet = statement.getGeneratedKeys();
if (resultSet.next()) {
int userId = resultSet.getInt(1);
System.out.println("The last inserted user ID is: " + userId);
}
シーケンスを使用する
PostgreSQLでは、シーケンスを使用して、挿入される行のIDを自動的に生成することができます。
// 新しいレコードを挿入
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "John Doe");
statement.setString(2, "[email protected]");
statement.executeUpdate();
// 最後に挿入された行のIDを取得
String sql2 = "SELECT currval('users_id_seq')";
ResultSet resultSet = statement.executeQuery(sql2);
if (resultSet.next()) {
int userId = resultSet.getInt(1);
System.out.println("The last inserted user ID is: " + userId);
}
LASTVAL()
関数は、最後に挿入された行のIDを取得するために使用できます。
// 新しいレコードを挿入
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "John Doe");
statement.setString(2, "[email protected]");
statement.executeUpdate();
// 最後に挿入された行のIDを取得
String sql2 = "SELECT LASTVAL('users_id_seq')";
ResultSet resultSet = statement.executeQuery(sql2);
if (resultSet.next()) {
int userId = resultSet.getInt(1);
System.out.println("The last inserted user ID is: " + userId);
}
これらの方法のどれを使用しても、JavaでPostgreSQLデータベースから最後に挿入された行の値を取得することができます。どの方法を使用するかは、要件と好みによって異なります。
補足
- 上記の例では、
users
テーブルにid
という名前の主キーがあることを前提としています。 - 複数の列の値を取得したい場合は、
RETURNING
句で複数の列を指定する必要があります。 - シーケンスを使用しない場合は、
INSERT
ステートメントにid
列の値を明示的に指定する必要があります。
import java.sql.*;
public class GetLastInsertedRow {
public static void main(String[] args) throws Exception {
// データベースへの接続
Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydb", "postgres", "postgres");
// 新しいレコードを挿入
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
statement.setString(1, "John Doe");
statement.setString(2, "[email protected]");
statement.executeUpdate();
// 最後に挿入された行のIDを取得
ResultSet resultSet = statement.getGeneratedKeys();
if (resultSet.next()) {
int userId = resultSet.getInt(1);
System.out.println("The last inserted user ID is: " + userId);
}
// 接続を閉じる
connection.close();
}
}
実行方法
- 上記のコードを
GetLastInsertedRow.java
という名前のファイルに保存します。 - Java Development Kit (JDK)をインストールします。
- 以下のコマンドを実行してコードをコンパイルします。
javac GetLastInsertedRow.java
java GetLastInsertedRow
出力
The last inserted user ID is: 1
この出力は、最後に挿入された行のIDが1であることを示しています。
他の方法
IDENTITY列を使用する
// 新しいレコードを挿入
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "John Doe");
statement.setString(2, "[email protected]");
statement.executeUpdate();
// 最後に挿入された行のIDを取得
int userId = statement.getGeneratedKeys().getInt(1);
System.out.println("The last inserted user ID is: " + userId);
pgjdbc
ドライバは、PostgreSQLデータベースへの接続に使用できるJDBCドライバです。このドライバには、getLastInsertId()
メソッドを使用して、最後に挿入された行のIDを取得する機能があります。
// 新しいレコードを挿入
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, "John Doe");
statement.setString(2, "[email protected]");
statement.executeUpdate();
// 最後に挿入された行のIDを取得
int userId = statement.getLastInsertId();
System.out.println("The last inserted user ID is: " + userId);
これらの方法は、上記で紹介した方法よりも簡潔で効率的です。ただし、これらの方法を使用するには、PostgreSQLのバージョンとJDBCドライバのバージョンに注意する必要があります。
java database postgresql