La clave principal de la fila insertada jdbc?

¿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 obtener al llamar a SELECT LAST_INSERT_ID() y creo que puede llamar a SELECT @@ IDENTITY AS 'Identity'; ¿hay alguna forma común de hacerlo a través de las 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?

37

7 Respuestas

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.

48
agregado
Funciona con Postgres, pero no con Oracle
agregado el autor Broken_Window, fuente
En Sybase ASE, esto solo funciona si ha instalado las tablas de acceso o información de metadatos. De lo contrario, debe usar @@ identity .
agregado el autor danny, fuente

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);
}
21
agregado
Trabajé para mí con Oracle 11g Express y Java 8.
agregado el autor Broken_Window, fuente
¡Trabajó! Se debe prestar especial atención a rs.getLong (1) debes proporcionar el índice y no el nombre
agregado el autor SashikaXP, fuente

¿Has probado el Statement.executeUpdate() y Declaración. Métodos getGeneratedKeys() ? Hay un artículo developerWorks en el que se menciona el enfoque.

Además, en JDBC 4.0 Sun agregó el row_id feature 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!

3
agregado

Just declare id column as id integer not NULL primary key 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() , mostrará todos los valores de la columna de id.

2
agregado

Spring brinda algún soporte útil para esta operación y la guía de referencia parece responder a su pregunta:

No hay una única forma estándar de   crear un apropiado   PreparedStatement (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.

1
agregado

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

1
agregado

Para las bases de datos que cumplen con SQL-99, puede usar columnas de identidad: CREATE TABLE sometable (ID INTEGER GENERADO SIEMPRE COMO IDENTIDAD (COMIENZA 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 ()

1
agregado