Question MySQL & Java - Récupère l'identifiant de la dernière valeur insérée (JDBC) [duplicate]


Duplication possible:
Comment obtenir l'ID d'insertion dans JDBC? 

Bonjour, j'utilise JDBC pour me connecter à la base de données via Java.

Maintenant, je fais une requête d'insertion, et je dois obtenir l'id de la dernière valeur insérée (donc, après un stmt.executeUpdate).

Je n'ai pas besoin de quelque chose comme SELECT id FROM table ORDER BY id DESC LIMIT 1, car je peux avoir des problèmes de concurrence.

J'ai juste besoin de récupérer l'identifiant associé à la dernière insertion (à propos de mon instance de la déclaration).

J'ai essayé ceci, mais semble ne pas fonctionner sur 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;
}

En fait, chaque fois risultato = -1, et je reçois java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().

Comment puis-je résoudre ce problème? Merci aux gens de Stackoverflow :)


77
2017-11-22 14:49


origine


Réponses:


Ne voudriez-vous pas simplement changer:

numero = stmt.executeUpdate(query);

à:

numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

Jetez un oeil à la documentation du JDBC Statement interface.

Mettre à jour: Apparemment, il y a beaucoup de confusion à propos de cette réponse, mais je suppose que les personnes confuses ne le lisent pas dans le contexte de la question posée. Si vous prenez le code que l'OP a fourni dans sa question et remplacez la seule ligne (ligne 6) que je suggère, tout fonctionnera. le numero variable est complètement inutile et sa valeur n'est jamais lue une fois définie.


155
2017-11-22 14:53



Sinon, vous pouvez faire:

Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
numero = stmt.executeUpdate();

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
    risultato=rs.getInt(1);
}

Mais utilisez plutôt la réponse de Sean Bright pour votre scénario.


117
2017-11-22 14:58