studio programacion para móviles libro edición desarrollo curso aplicaciones java database postgresql jdbc

java - programacion - ¿Cómo obtener un valor de la última fila insertada?



manual de programacion android pdf (14)

Esta pregunta ya tiene una respuesta aquí:

¿Hay alguna forma de obtener un valor de la última fila insertada?

Estoy insertando una fila donde el PK aumentará automáticamente, y me gustaría obtener este PK. Solo se garantiza que el PK será único en la tabla.

Estoy usando Java con un JDBC y PostgreSQL.


Así es como lo resolví, basado en las respuestas aquí:

Connection conn = ConnectToDB(); //ConnectToDB establishes a connection to the database. String sql = "INSERT INTO /"TableName/"" + "(/"Column1/", /"Column2/",/"Column3/",/"Column4/")" + "VALUES (''value1'',value2, ''value3'', ''value4'') RETURNING /"TableName/"./"TableId/""; PreparedStatement prpState = conn.prepareStatement(sql); ResultSet rs = prpState.executeQuery(); if(rs.next()){ System.out.println(rs.getInt(1)); }


Con PostgreSQL puede hacerlo a través de la palabra clave RETURNING:

PostgresSQL - DEVOLUCIÓN

INSERT INTO mytable( field_1, field_2,... ) VALUES ( value_1, value_2 ) RETURNING anyfield

Devolverá el valor de "anyfield". "anyfield" puede ser una secuencia o no.

Para usarlo con JDBC, hazlo:

ResultSet rs = statement.executeQuery("INSERT ... RETURNING ID"); rs.next(); rs.getInt(1);


Consulte los documentos de la API para java.sql.Statement .

Básicamente, cuando llamas a executeUpdate() o executeQuery() , usa la constante Statement.RETURN_GENERATED_KEYS . A continuación, puede llamar a getGeneratedKeys para obtener las claves generadas automáticamente de todas las filas creadas por esa ejecución. (Suponiendo que su controlador JDBC lo proporciona).

Va algo así como esto:

Statement stmt = conn.createStatement(); stmt.execute(sql, Statement.RETURN_GENERATED_KEYS); ResultSet keyset = stmt.getGeneratedKeys();


Desde el controlador PostgreSQL JDBC versión 8.4-701 el PreparedStatement#getGeneratedKeys() finalmente es completamente funcional. Lo usamos aquí casi un año en producción para nuestra plena satisfacción.

En "JDBC simple", se debe crear PreparedStatement siguiente manera para que devuelva las claves:

statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

Puede descargar la versión actual del controlador JDBC here (que en este momento sigue siendo 8.4-701).


Las secuencias en postgresql son seguras para transacciones. Entonces puedes usar el

currval(sequence)

Quote:

Currval

Devuelve el valor obtenido más recientemente por nextval para esta secuencia en la sesión actual. (Se informa un error si nunca se ha llamado a nextval para esta secuencia en esta sesión.) Tenga en cuenta que dado que esto devuelve un valor local de sesión, proporciona una respuesta predecible incluso si otras sesiones ejecutan nextval mientras tanto.


No use el CURRVAL SELECT (''MySequence'') - el valor se incrementa en las inserciones que fallan.


Para MyBatis 3.0.4 con Annotations y el driver Postgresql 9.0-801.jdbc4, defina un método de interfaz en su Mapper como

public interface ObjectiveMapper { @Select("insert into objectives" + " (code,title,description) values" + " (#{code}, #{title}, #{description}) returning id") int insert(Objective anObjective);

Tenga en cuenta que se usa @Select en lugar de @Insert.


Si está en una transacción, puede usar SELECT lastval() después de una inserción para obtener la última ID generada.


Si está utilizando Statement , busque la siguiente

//MY_NUMBER is the column name in the database String generatedColumns[] = {"MY_NUMBER"}; Statement stmt = conn.createStatement(); //String sql holds the insert query stmt.executeUpdate(sql, generatedColumns); ResultSet rs = stmt.getGeneratedKeys(); // The generated id if(rs.next()) long key = rs.getLong(1);

Si está utilizando PreparedStatement , vaya por lo siguiente

String generatedColumns[] = {"MY_NUMBER"}; PreparedStatement pstmt = conn.prepareStatement(sql,generatedColumns); pstmt.setString(1, "qwerty"); pstmt.execute(); ResultSet rs = pstmt.getGeneratedKeys(); if(rs.next()) long key = rs.getLong(1);


Si está utilizando JDBC 3.0, puede obtener el valor de PK tan pronto como lo inserte.

Aquí hay un artículo que habla de cómo: https://www.ibm.com/developerworks/java/library/j-jdbcnew/

Statement stmt = conn.createStatement(); // Obtain the generated key that results from the query. stmt.executeUpdate("INSERT INTO authors " + "(first_name, last_name) " + "VALUES (''George'', ''Orwell'')", Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getGeneratedKeys(); if ( rs.next() ) { // Retrieve the auto generated key(s). int key = rs.getInt(1); }


Usa ese código simple:

// Do your insert code myDataBase.execSQL("INSERT INTO TABLE_NAME (FIELD_NAME1,FIELD_NAME2,...)VALUES (VALUE1,VALUE2,...)"); // Use the sqlite function "last_insert_rowid" Cursor last_id_inserted = yourBD.rawQuery("SELECT last_insert_rowid()", null); // Retrieve data from cursor. last_id_inserted.moveToFirst(); // Don''t forget that! ultimo_id = last_id_inserted.getLong(0); // For Java, the result is returned on Long type (64)


Usa secuencias en postgres para columnas de id.

INSERT mytable(myid) VALUES (nextval(''MySequence'')); SELECT currval(''MySequence'');

currval devolverá el valor actual de la secuencia en la misma sesión.

(En MS SQL, usaría @@ identity o SCOPE_IDENTITY ())


por ejemplo:

Connection conn = null; PreparedStatement sth = null; ResultSet rs =null; try { conn = delegate.getConnection(); sth = conn.prepareStatement(INSERT_SQL); sth.setString(1, pais.getNombre()); sth.executeUpdate(); rs=sth.getGeneratedKeys(); if(rs.next()){ Integer id = (Integer) rs.getInt(1); pais.setId(id); } }

con ,Statement.RETURN_GENERATED_KEYS);" no encontrado.


PreparedStatement stmt = getConnection(PROJECTDB + 2) .prepareStatement("INSERT INTO fonts (font_size) VALUES(?) RETURNING fonts.*"); stmt.setString(1, "986"); ResultSet res = stmt.executeQuery(); while (res.next()) { System.out.println("Generated key: " + res.getLong(1)); System.out.println("Generated key: " + res.getInt(2)); System.out.println("Generated key: " + res.getInt(3)); } stmt.close();