JavaプログラマーのためのSQLiteチュートリアル: 最後に挿入されたIDを取得する
JavaからSQLiteの最後に挿入されたIDを取得する
LAST_INSERT_ID()
関数は、現在の接続で使用されている最後の自動生成されたIDを返します。 以下のコード例は、LAST_INSERT_ID()
関数を使用して、最後に挿入されたIDを取得する方法を示しています。
// データベース接続を確立
Connection connection = DriverManager.getConnection("jdbc:sqlite:database.db");
// INSERT文を実行
Statement statement = connection.createStatement();
statement.executeUpdate("INSERT INTO table (name, age) VALUES ('John Doe', 30)");
// 最後に挿入されたIDを取得
int lastInsertedId = statement.getGeneratedKeys().getInt(1);
// 接続を閉じる
statement.close();
connection.close();
RETURNING 句を使用する
SQLite 3.8以降では、RETURNING
句を使用して、INSERT
文の実行時に自動生成されたIDを直接取得することができます。 以下のコード例は、RETURNING
句を使用して、最後に挿入されたIDを取得する方法を示しています。
// データベース接続を確立
Connection connection = DriverManager.getConnection("jdbc:sqlite:database.db");
// INSERT文を実行
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("INSERT INTO table (name, age) VALUES ('John Doe', 30) RETURNING id");
// 最後に挿入されたIDを取得
int lastInsertedId = resultSet.getInt("id");
// 接続を閉じる
resultSet.close();
statement.close();
connection.close();
getGeneratedKeys() メソッドを使用する
JDBC 4.1以降では、PreparedStatement
クラスの getGeneratedKeys()
メソッドを使用して、自動生成されたIDを取得することができます。 以下のコード例は、getGeneratedKeys()
メソッドを使用して、最後に挿入されたIDを取得する方法を示しています。
// データベース接続を確立
Connection connection = DriverManager.getConnection("jdbc:sqlite:database.db");
// INSERT文を準備
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO table (name, age) VALUES (?, ?)");
preparedStatement.setString(1, "John Doe");
preparedStatement.setInt(2, 30);
// INSERT文を実行
preparedStatement.executeUpdate();
// 最後に挿入されたIDを取得
ResultSet resultSet = preparedStatement.getGeneratedKeys();
int lastInsertedId = resultSet.getInt(1);
// 接続を閉じる
resultSet.close();
preparedStatement.close();
connection.close();
その他の注意事項
- 上記のコード例は、単一のIDを取得する例です。 複数のIDを取得する場合は、
ResultSet
オブジェクトをループ処理する必要があります。 - 自動生成されたIDを取得するには、
id
列がAUTOINCREMENT
キーワードで定義されている必要があります。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class GetLastInsertedId {
public static void main(String[] args) throws Exception {
// データベース接続を確立
Connection connection = DriverManager.getConnection("jdbc:sqlite:database.db");
// INSERT文を実行
Statement statement = connection.createStatement();
statement.executeUpdate("INSERT INTO table (name, age) VALUES ('John Doe', 30)");
// 最後に挿入されたIDを取得
int lastInsertedId = statement.getGeneratedKeys().getInt(1);
// 結果を出力
System.out.println("最後に挿入されたID: " + lastInsertedId);
// 接続を閉じる
statement.close();
connection.close();
}
}
このコードを実行するには、以下の準備が必要です。
- SQLite データベースファイル
database.db
が存在する必要があります。 - テーブル
table
が存在する必要があります。 テーブルtable
は、id
列 (AUTOINCREMENT キーワード付き)、name
列、age
列を持つ必要があります。
このコードを実行すると、コンソールに以下のような出力が表示されます。
最後に挿入されたID: 1
他の方法
sqlite3_last_insert_rowid()
関数は、現在の接続で使用されている最後の自動生成されたIDを返します。 この関数は、JNI (Java Native Interface) を使用してC言語のSQLite APIを呼び出す必要があるため、より複雑な方法となります。
シーケンスを使用する
SQLite では、シーケンスを使用して自動生成されたIDを生成することができます。 シーケンスを使用するには、まずシーケンスを作成する必要があります。 以下のコード例は、シーケンスを作成する方法を示しています。
CREATE SEQUENCE my_sequence;
シーケンスを作成したら、INSERT
文で NEXT VALUE FOR
句を使用して、シーケンスから次の値を取得することができます。 以下のコード例は、シーケンスを使用して、最後に挿入されたIDを取得する方法を示しています。
// データベース接続を確立
Connection connection = DriverManager.getConnection("jdbc:sqlite:database.db");
// INSERT文を実行
Statement statement = connection.createStatement();
statement.executeUpdate("INSERT INTO table (name, age) VALUES ('John Doe', 30) RETURNING NEXT VALUE FOR my_sequence");
// 最後に挿入されたIDを取得
int lastInsertedId = statement.getGeneratedKeys().getInt(1);
// 接続を閉じる
statement.close();
connection.close();
トリガーを使用する
SQLite では、トリガーを使用して、特定のイベントが発生したときにコードを実行することができます。 トリガーを使用して、レコードが挿入されたときに、最後に挿入されたIDを取得することができます。
java sqlite jdbc