2010-04-15 17 views
13

Mi método actual es la siguiente:SQL (Java, h2): ¿Cuál es la mejor manera de recuperar la identificación única del único elemento que acabo de insertar en mi base de datos?

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC 

Esto supone el último elemento insertado siempre tiene el identificador único más alto (clave principal, autoincremental). Algo huele mal aquí.

¿Alternativas?

+0

Pregunta FYI, casi duplicado: [¿Hay una manera de recuperar el ID de incremento automático de la sentencia preparada] (http://stackoverflow.com/q/1376218/642706) –

Respuesta

22

Si t El controlador JDBC lo admite, también puede usar Statement#getGeneratedKeys() para eso.

String sql = "INSERT INTO tbl (col) VALUES (?)"; 
preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
preparedStatement.setString(1, col); 
preparedStatement.executeUpdate(); 
generatedKeys = preparedStatement.getGeneratedKeys(); 
if (generatedKeys.next()) { 
    long id = generatedKeys.getLong(1); 
} else { 
    // Throw exception? 
} 
+0

Déjeme ver si esto funciona ... –

+1

Según mi experiencia y conocimiento, todas las versiones actuales del controlador JDBC de los principales servidores RDBMS como MySQL, MSSQL, PostgreSQL, Oracle y DB2 lo soportan (llevó un tiempo para Oracle y PostgreSQL, hasta hace aproximadamente un año no lo apoyaron). Lamentablemente, no tengo experiencia con H2, por lo que no puedo decirlo de primera mano, pero un rápido vistazo a Google me dice que no lo admite. – BalusC

+0

Muy bien, ¡funciona! ¿Es esto mejor que IDENTITY(), sin embargo? –

5

Si el uso de MySQL se puede hacer

select last_insert_id(); 

Si se utiliza MS SQL

select scope_identity(); 

Para H2, creo que es

CALL SCOPE_IDENTITY(); 

pero no tengo ninguna experiencia con que DB

+0

Hmm. Me pregunto si hay un H2 equivalente ... –

+0

Lo siento, no vi la etiqueta h2 inicialmente. Actualicé mi respuesta con lo que creo que es el equivalente. – Sean

+0

Bueno, voy a insertar con instancias de PreparedStatement en Java, por lo que podría necesitar IDENTITY() en su lugar. Pero sí, eso debería hacerlo. Gracias. –

Cuestiones relacionadas