可能性のある複製:
JDBCで挿入IDを取得する方法
こんにちは、JDBCを使用して、Java経由でデータベースに接続しています。
今、私はいくつかの挿入クエリを行い、最後に挿入された値のIDを取得する必要があります(したがって、stmt.executeUpdate
の後に)。
同時実行の問題がある可能性があるため、SELECT id FROM table ORDER BY id DESC LIMIT 1
のようなものは必要ありません。
最後の挿入に関連付けられたIDを取得するだけです(ステートメントの私のインスタンスについて)。
私はこれを試しましたが、JDBCでは動作しないようです:
public Integer insertQueryGetId(String query) {
Integer numero=0;
Integer risultato=-1;
try {
Statement stmt = db.createStatement();
numero = stmt.executeUpdate(query);
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
risultato=rs.getInt(1);
}
rs.close();
stmt.close();
} catch (Exception e) {
e.printStackTrace();
errore = e.getMessage();
risultato=-1;
}
return risultato;
}
実際、毎回risultato = -1
、そしてJava.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
を取得します
この問題を修正するにはどうすればよいですか? Stackoverflowの人々に感謝します:)
ただ変えてみませんか:
numero = stmt.executeUpdate(query);
に:
numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
JDBC Statement
インターフェースのドキュメントをご覧ください。
Update:どうやらこの回答について多くの混乱がありますが、私の推測では、混乱している人々はこの文脈でそれを読んでいないようです。尋ねられた質問。 OPが彼の質問で提供したコードを取り、私が提案している1行(6行目)を置き換えると、すべてが機能します。 numero
変数は完全に無関係であり、設定後に値が読み取られることはありません。
または、次のこともできます。
Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
numero = stmt.executeUpdate();
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
risultato=rs.getInt(1);
}
ただし、シナリオにはSean Brightの答えを代わりに使用してください。