marcazzz
Posible duplicado:
¿Cómo obtener la ID de inserción en JDBC?
Hola, estoy usando JDBC para conectarme a la base de datos a través de Java.
Ahora, realizo una consulta de inserción y necesito obtener la identificación del último valor insertado (entonces, 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 concurrencia.
Solo necesito recuperar la identificación asociada a la última inserción (sobre mi instancia de la Declaración).
Intenté 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 risultato = -1
y obtengo java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
¿Como puedo solucionar este problema? Gracias gente de Stackoverflow 🙂
Sean brillante
¿No cambiarías simplemente:
numero = stmt.executeUpdate(query);
a:
numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
Eche un vistazo a la documentación para el JDBC Statement
interfaz.
Actualizar: Aparentemente, hay mucha confusión sobre esta respuesta, pero supongo que las personas que están confundidas no la están leyendo en el contexto de la pregunta que se hizo. Si toma el código que proporcionó el OP en su pregunta y reemplaza la línea única (línea 6) que sugiero, todo funcionará. los numero
La variable es completamente irrelevante y su valor nunca se lee después de establecerse.
-
¡¡¡Tú Molas!!! Jejeje, no soy tan capaz de leer este mensaje de advertencia 🙂
– marcazzz
22 de noviembre de 2010 a las 15:00
-
+1 para
RETURN_GENERATED_KEYS
– bizzr3
8 oct 2014 a las 11:27
-
sí, esto realmente no funciona. Intente insertar un par de registros, elimínelos todos (NO TRUNCATE) y vea si se recupera la ID correcta;)
– Pedro
29 de marzo de 2015 a las 0:54
-
@ wu-lee El valor de retorno es irrelevante (en la pregunta de OP,
numero
no se usa). Notarás que itera sobre elResultSet
devuelto porStatement.getGeneratedKeys()
. Déjame saber si tienes otras preguntas.– Sean brillante
17 de junio de 2015 a las 11:42
-
Eso es simplemente incorrecto… El método executeUpdate devuelve: (1) el recuento de filas para las declaraciones del Lenguaje de manipulación de datos SQL (DML) o (2) 0 para las declaraciones SQL que no devuelven nada. Tienes que crear un conjunto de resultados y obtener la última ID como esta: rs = st.getGeneratedKeys(); if(rs.next()) { insertId = rs.getInt(1); }
– slodeveloper
08/04/2016 a las 20:30
buhake sindi
Alternativamente puedes hacer:
Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
numero = stmt.executeUpdate();
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
risultato=rs.getString(1);
}
Pero use la respuesta de Sean Bright en su lugar para su escenario.
-
¡Muchos gracias! No sabía que esto era posible usando JDBC, estaba atascado tratando de obtener todas las claves generadas al insertar varias filas en una tabla. Realmente necesitaba esas claves incrementadas automáticamente, y
LAST_INSERT_ID(); + 1
No confiaba completamente, ¡esto debería ser seguro de cualquier manera!– yeti
04/04/2012 a las 19:10
-
Sé que tengo 2 años de retraso, pero gracias 🙂 esto funcionó: D
– Rorchackh
29 de mayo de 2012 a las 2:28
-
Gracias hombre, ¡esta fue la única forma en que funcionó! 🙂
– Nick
24 de enero de 2013 a las 5:06
-
Muy bien, plus1 por explicar cómo conseguir las llaves…
– Roee Gavirel
12 de abril de 2015 a las 16:14
-
Este funciona para mí, me salvaste el día.
– andre_northwind
3 de junio de 2015 a las 4:48
Vea mi pregunta: stackoverflow.com/questions/4224228/…
– Buhake Sindi
22 de noviembre de 2010 a las 14:55
Duplicado de ¿Cómo obtener el ID de inserción en JDBC?
– BalusC
22 de noviembre de 2010 a las 14:59