MySQL y Java: obtenga la identificación del último valor insertado (JDBC) [duplicate]

3 minutos de lectura

avatar de usuario
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 1porque 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 = -1y 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 🙂

  • 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


avatar de usuario
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 el ResultSet devuelto por Statement.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


avatar de usuario
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

¿Ha sido útil esta solución?