2010-11-22 4 views
75

Duplicate possible:
How to get the insert ID in JDBC?MySQL et Java - Obtenir l'identifiant de la dernière valeur insérée (JDBC)

Salut, je suis en utilisant JDBC pour se connecter sur la base de données à travers 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, parce que 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 l'instruction).

J'ai essayé, mais il semble ne fonctionne pas 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 :) Stackoverflow Personnes

+0

Voir ma question: http://stackoverflow.com/questions/4224228/preparedstatement-with-statement-return-generated-keys –

+0

Dupliquer de [Comment obtenir l'ID d'insertion dans JDBC?] (Http: // stackoverflow .com/questions/1915166/comment-obtenir-le-insert-id-in-jdbc) – BalusC

Répondre

147

Ne serait-vous changer simplement:

numero = stmt.executeUpdate(query); 

à:

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

Jetez un oeil à la documentation de l'interface JDBC Statement.

Mise à jour: Apparemment, il y a beaucoup de confusion à propos de cette réponse, mais je suppose que les gens qui sont confus 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 ligne simple (ligne 6) que je suggère, tout fonctionnera. La variable numero est complètement non pertinente et sa valeur n'est jamais lue après qu'elle est définie.

+1

Vous Rock! Heheh, je ne suis pas si capable de lire ce message d'avertissement :) – markzzz

+1

+1 pour 'RETURN_GENERATED_KEYS' – bizzr3

+0

ouais, cela ne fonctionne pas vraiment. Essayez d'insérer quelques enregistrements, supprimez-les tous (NOT TRUNCATE) et vérifiez si l'ID correct est récupéré;) – Pierre

108

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 utiliser la réponse de Sean à la place pour votre brillant scénario.

+0

Merci beaucoup! Je ne savais pas que c'était possible en utilisant JDBC, j'étais bloqué 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 incrémentées automatiquement, et 'LAST_INSERT_ID(); + 1' Je n'avais pas confiance complètement, cela devrait être sûr de quelque façon que ce soit! – Yeti

+2

Je sais que j'ai 2 ans de retard, mais merci :) cela a fonctionné: D – Rorchackh

+1

Merci mon pote, c'était la seule façon dont ça a marché! :) – Nick

Questions connexes