101 votes

MySQL & Java - Obtenir l'identifiant de la dernière valeur insérée (JDBC)

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

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

Maintenant, je fais une requête d'insertion, et j'ai besoin d'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 risque d'avoir des problèmes de concurrence.

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

J'ai essayé, mais il semble que cela ne fonctionne pas avec 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 j'obtiens 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 :)

0 votes

0 votes

180voto

Sean Bright Points 39480

Tu ne voudrais pas changer :

numero = stmt.executeUpdate(query);

à :

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

Jetez un coup d'œil à la documentation sur le JDBC Statement interface.

Mise à jour : Apparemment, il y a beaucoup de confusion au sujet de cette réponse, mais mon avis est que les personnes qui sont confuses ne la lisent pas dans le contexte de la question qui a été posée. Si vous prenez le code que le PO a fourni dans sa question et remplacez la seule ligne (ligne 6) que je suggère, tout fonctionnera. Le site numero n'est absolument pas pertinente et sa valeur n'est jamais lue après qu'elle ait été définie.

1 votes

Tu es génial ! !! Heheh, je ne suis pas en mesure de lire ce message d'avertissement :)

1 votes

+1 pour RETURN_GENERATED_KEYS

0 votes

Ouais, ça ne marche pas vraiment. Essayez d'insérer quelques enregistrements, supprimez-les tous (PAS TRUNCATE) et voyez si l'ID correct est récupéré ;)

146voto

Buhake Sindi Points 38654

Vous pouvez aussi le faire :

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

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

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

0 votes

Merci beaucoup ! Je ne savais pas que cela était possible en utilisant JDBC, j'étais coincé en essayant d'obtenir toutes les clés générées lors de l'insertion de plusieurs lignes dans une table. J'avais vraiment besoin de ces clés auto-incrémentées, et LAST_INSERT_ID(); + 1 Je n'ai pas fait entièrement confiance, cela devrait être sûr de toute façon !

3 votes

Je sais que j'ai 2 ans de retard, mais merci :) ça a marché :D

1 votes

Merci mec, c'était la seule façon de faire fonctionner le système :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X