2010-11-22 41 views
75

Duplicar posibles:
How to get the insert ID in JDBC?MySQL y Java - Obtener ID del último valor insertado (JDBC)

Hola, estoy usando JDBC para conectarse a la base de datos a través hacia fuera de Java.

Ahora, hago algunas consultas de inserción, y necesito obtener la identificación del último valor insertado (por lo tanto, después de un stmt.executeUpdate).

No necesito algo como SELECT id FROM table ORDER BY id DESC LIMIT 1, porque puedo tener problemas de simultaneidad.

Solo necesito recuperar la identificación asociada a la última inserción (sobre mi instancia de la Declaración).

He intentado esto, pero parece que no funciona en 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; 
} 

De hecho, cada vez que risultato = -1, y me da java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().

¿Cómo puedo solucionar este problema? Gracias gente Stackoverflow :)

+0

Consulte mi pregunta: http://stackoverflow.com/questions/4224228/preparedstatement-with-statement-return-generated-keys –

+0

Duplicado de [¿Cómo obtener el ID de inserción en JDBC?] (Http: // stackoverflow .com/questions/1915166/how-to-get-the-insert-id-in-jdbc) – BalusC

Respuesta

147

No sería que acaba de cambiar:

numero = stmt.executeUpdate(query); 

a:

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

Tome un vistazo a la documentación de la interfaz JDBC Statement.

Actualización: Aparentemente hay mucha confusión acerca de esta respuesta, pero creo que las personas que están confundidas no lo están leyendo en el contexto de la pregunta que se hizo. Si toma el código que el OP brindó en su pregunta y reemplaza la línea individual (línea 6) que estoy sugiriendo, todo funcionará. La variable numero es completamente irrelevante y su valor nunca se lee después de establecerse.

+1

You Rock !!! Heheh, no soy tan capaz de leer este mensaje de advertencia :) – markzzz

+1

+1 para 'RETURN_GENERATED_KEYS' – bizzr3

+0

Sí, esto realmente no funciona. Intente insertar un par de registros, elimínelos (NO TRUNCATE) y vea si se recuperó el ID correcto;) – Pierre

108

alternativa que puede hacer:

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

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

Pero utilizar la respuesta de Sean brillante lugar para su escenario.

+0

¡Muchas gracias! No sabía que esto era posible usando JDBC, estaba atascado en tratar de obtener todas las claves generadas al insertar varias filas en una tabla. Realmente necesitaba esas teclas autoincrementadas, y 'LAST_INSERT_ID(); + 1' No confié completamente, esto debería ser seguro de cualquier manera! – Yeti

+2

Sé que tengo 2 años de retraso, pero gracias :) esto funcionó: D – Rorchackh

+1

Gracias hombre, ¡esta fue la única forma en que funcionó! :) – Nick

Cuestiones relacionadas