java - sirve - La clave principal de la fila insertada jdbc?
para que sirve la clave principal en access (7)
¿Existe una forma de plataforma de base de datos cruzada para obtener la clave principal del registro que acaba de insertar?
Noté que esta respuesta dice que puede obtenerla llamando a SELECT LAST_INSERT_ID()
y creo que puede llamar a SELECT @@IDENTITY AS ''Identity'';
¿Hay alguna forma común de hacerlo en bases de datos en jdbc?
Si no, ¿cómo sugeriría que implemente esto para un fragmento de código que podría acceder a SQL Server, MySQL y Oracle?
¿Has probado los métodos Statement.executeUpdate() y Statement.getGeneratedKeys() ? Hay un artículo de developerWorks que menciona el enfoque.
Además, en JDBC 4.0 Sun agregó la característica row_id que le permite obtener un identificador único en una fila. La característica es compatible con Oracle y DB2. Para el servidor sql probablemente necesite un controlador de terceros como este .
¡Buena suerte!
Copiado de mi código:
pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS);
donde pInsertOid es una declaración preparada.
a continuación, puede obtener la clave:
// fill in the prepared statement and
pInsertOid.executeUpdate();
ResultSet rs = pInsertOid.getGeneratedKeys();
if (rs.next()) {
int newId = rs.getInt(1);
oid.setId(newId);
}
Espero que esto te dé un buen punto de partida.
Para las bases de datos que se ajustan a SQL-99, puede usar columnas de identidad: CREATE TABLE sometable (ID INTEGER GENERADO SIEMPRE COMO IDENTIDAD (COMIENCE CON 101) PRIMARY KEY, ...
Utilice getGeneratedKeys() para recuperar la clave que acaba de insertarse con executeUpdate (String sql, int autoGeneratedKeys) . Use Statement.RETURN_GENERATED_KEYS para el 2do parámetro para executeUpdate ()
Simplemente declare la columna de identificación como entero de identificación no clave primaria NULL auto_increment
después de esto, ejecuta este código
ResultSet ds=st.executeQuery("select * from user");
while(ds.next())
{
ds.last();
System.out.println("please note down your registration id which is "+ds.getInt("id"));
}
ds.close();
el código anterior le mostrará la identificación de la fila actual
si elimina ds.last()
de lo que mostrará todos los valores de la columna de id.
Spring proporciona algún soporte útil para esta operación y la guía de referencia parece responder a su pregunta:
No existe una única forma estándar para crear un PreparedStatement apropiado (lo que explica por qué la firma del método es la forma en que es). Un ejemplo que funciona en Oracle y puede no funcionar en otras plataformas es ...
He probado este ejemplo en MySQL y funciona también allí, pero no puedo hablar de otras plataformas.
la respuesta de extraneon, aunque es correcta, no funciona para Oracle .
La forma en que haces esto para Oracle es:
String key[] = {"ID"}; //put the name of the primary key column
ps = con.prepareStatement(insertQuery, key);
ps.executeUpdate();
rs = ps.getGeneratedKeys();
if (rs.next()) {
generatedKey = rs.getLong(1);
}
para Oracle, Hibernate usa NEXT_VALUE de una secuencia si ha mapeado una secuencia para la generación de valor PKEY.
No estoy seguro de lo que hace para MySQL o MS SQL Server