2008-10-19 25 views

Respuesta

9

Use getGeneratedKeys() si su controlador JDBC lo admite. No querrá ensuciar tratando de obtener la llave usted mismo después del inserto. Si su controlador no es compatible con getGeneratedKeys(), obtendría el siguiente valor de la clave antes de la inserción.

+0

¿De qué manera ¿Es "el siguiente valor de la clave antes de la inserción" algo mejor que "el valor más grande después de la inserción"? Ambos tienen el mismo tipo de condición de carrera, y ambos se basan en incrementos únicos monotónicos de la tecla. –

+0

Se supone que la clave recuperada antes de la inserción no se basará en ninguna consulta de la tabla de destino, sino de algún proveedor clave. En términos de Oracle, sería Select sequence_name.nextval from dual. No conozco los detalles de SQL Lite pero una API llamada que devuelve una clave en su propia transacción autónoma completamente independiente de la inserción. Dicho eso ... use getGeneratedKeys(). –

+0

row = stmt.getGeneratedKeys(). GetInt (1); –

20

Cualquiera de los enfoques ejecuta la misma instrucción SQL exacta, pero java.sql.Statement.getGeneratedKeys() es más portátil para diferentes bases de datos subyacentes.

El uso de la función sqlite3_last_insert_rowid() C API o la función SQL last_insert_rowid() es la forma correcta de recuperar el rowid generado durante la última inserción.

SQLite apoya la sintaxis SQL scalar function como:

SELECT function-name(); 

Por lo tanto, si usted no tiene acceso a la API de C directamente, puede invocar la función escalar last_insert_rowid() a través de un comunicado SELECT.

Si nos fijamos en la source code para la SQLiteJDBC aplicación (es esto lo que estás usando?) Se verá que esto es exactamente lo que el autor de ese envoltorio JDBC ha hecho:

ResultSet getGeneratedKeys() throws SQLException { 
    if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement(
     "select last_insert_rowid();"); 
    return getGeneratedKeys.executeQuery(); 
} 
Cuestiones relacionadas