私が使う com.mysql.jdbc.Driver
挿入してIDを取得する必要があります。私のクエリ:
INSERT INTO Sessions(id_user) VALUES(1);
SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;
エラー-
ExecuteQuery()ではデータ操作ステートメントを発行できません
どのようにIDを挿入して取得しますか?
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet generatedKeys = null;
try {
connection = m_Connection;
preparedStatement = (PreparedStatement) connection.prepareStatement(qString, Statement.RETURN_GENERATED_KEYS);
// ...
int affectedRows = preparedStatement.executeUpdate();
if (affectedRows == 0) {
throw new SQLException("Creating user failed, no rows affected.");
}
generatedKeys = preparedStatement.getGeneratedKeys();
int id = -1;
if (generatedKeys.next()) {
id = generatedKeys.getInt(1);
id = -1;
} else {
throw new SQLException("Creating user failed, no generated key obtained.");
}
} finally {
}
INSERTステートメントを実行するには、executeUpdate()メソッドを使用する必要がありますが、SELECTステートメントを実行するには、executeQuery()メソッドを使用する必要があります。これは、JDBC仕様によってその使用法に課せられた要件によるものです。
Java API documentation for Statement.executeQuery() から:
指定されたSQLステートメントを実行し、単一のResultSetオブジェクトを返します。
パラメーター:
sql-データベースに送信されるSQLステートメント、通常は静的SQL SELECTステートメント
Java Statement.executeUpdate() のAPIドキュメント):
INSERT、UPDATE、またはDELETEステートメント、またはSQL DDLステートメントなど、何も返さないSQLステートメントである可能性がある、指定されたSQLステートメントを実行します。
パラメーター:
sql-SQLデータ操作言語(DML)ステートメント(INSERT、UPDATE、DELETEなど)。またはDDLステートメントなど、何も返さないSQLステートメント。
コード(ここに掲載されている疑似コード)は次のように表示されます。
statement.executeUpdate("INSERT INTO Sessions(id_user) VALUES(1)"); // DML operation
statement.executeQuery("SELECT LAST_INSERT_ID()"); // SELECT operation
そしてもちろん、 MySQLドキュメントは、明らかに必要なAUTO_INCREMENTカラム に対して同じアクティビティを実行する方法を示しています。
同じトランザクションで両方を一緒に実行する必要がある場合は、次のようにステートメントをセミコロンで区切って1つの文字列でステートメントを送信します。
statement.execute("INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;");
次に、execute()メソッドを使用する必要があります。これは、単一のexecute()でステートメントを一緒にバッチ処理するためのデータベースおよびJDBCドライバーによって提供されるサポートに依存することに注意してください。これはSybaseとMSSQLサーバーでサポートされていますが、MySQLではサポートされていないと思います。
executeQuery()を使用している可能性がありますが、データを操作するには、executeQuery()ではなく、executeUpdate()が実際に必要です。
非選択SQLステートメントの場合は、ExecuteNonQuery();
を使用します
最後に挿入されたIDを取得するには、次のSQLステートメントを実行できます。
SELECT LAST_INSERT_ID() AS last_id
おそらくJavaそのselect文のラッパーがありますが。
リンク:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
http://wiki.bibalex.org/JavaDoc/org/bibalex/daf/handlers/dbhandler/DBConnection.html