2010-11-22 18 views
75

olası Kopyaları kimliği alın:
How to get the insert ID in JDBC?MySQL & Java - Son eklenen değere (JDBC)

Merhaba, Java dışarı aracılığıyla veritabanı üzerinde bağlanmak üzere JDBC kullanıyorum.

Şimdi, bazı ekleme sorgusu yapıyorum ve son eklenen değerin kimliğini almam gerekiyor (bu nedenle, stmt.executeUpdate'dan sonra).

Eşzamanlılık sorunları yaşadığım için SELECT id FROM table ORDER BY id DESC LIMIT 1 gibi bir şeye ihtiyacım yok.

Sadece son ekleme ile ilişkili kimliği (Deyim örneğim hakkında) almam gerekiyor.

Bunu denedim, ama JDBC çalışmıyor görünüyor: Aslında

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; 
} 

, her zaman risultato = -1 ve bu sorunu çözebilirsiniz nasıl

java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement(). olsun? Teşekkür Stackoverflow İnsanlar :)

+0

Sorularıma göz atın: http://stackoverflow.com/questions/4224228/preparedstatement-with-statement-return-generated-keys –

+0

[JDBC'de ekleme tanıtıcısı nasıl alınır?] 'Nın kopyası (http: // stackoverflow .com/questions/1915166/nasıl yapılır-it-it-id-in-jdbc) – BalusC

cevap

147

sadece değiştirmek olmaz:

numero = stmt.executeUpdate(query); 

için:

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

JDBC Statement arayüzünde belgelerine bir göz atın.

Güncelleştirme: Görünüşe göre bu yanıtla ilgili bir sürü karışıklık var, ama benim tahminim şaşkın olan insanların sorulan soru bağlamında okumadıklarıdır. OP'in kendi sorusunda verdiği kodu alıp, önerdiğim tek satırı (satır 6) değiştirirseniz, her şey işe yarayacaktır. numero değişkeni tamamen ilgisizdir ve ayarlandıktan sonra değeri asla okunmaz.

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

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

Ama senaryo yerine Sean Bright cevabı kullanın:

+1

You Rock !!! Heheh, bu uyarı mesajını okuyamıyorum :) – markzzz

+1

+1 'RETURN_GENERATED_KEYS' için – bizzr3

+0

evet, bu gerçekten işe yaramaz. Birkaç kayıt eklemeyi deneyin, hepsini silin (TRUNCATE DEĞİL) ve doğru ID'nin geri getirilip getirilmediğine bakın;) – Pierre

108

Alternatif yapabilirsiniz.

+0

Çok teşekkür ederim! JDBC kullanarak bunun mümkün olduğunu bilmiyordum, bir tabloda birden çok satır eklerken oluşturulan tüm anahtarları almaya çalışırken takıldım. Bu otomatik artırılmış tuşlara gerçekten ihtiyacım vardı ve 'LAST_INSERT_ID(); + 1' Tamamen güvenmedim, bu herhangi bir şekilde güvenli olmalı! – Yeti

+2

Biliyorum 2 yıl geç kaldım, ama teşekkürler :) bu işe yaradı: D – Rorchackh

+1

Teşekkürler adam, bu işe yaramasının tek yolu buydu! :) – Nick

İlgili konular