RETURNING句を使って挿入IDを取得する方法 (PostgreSQLの場合)
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