2008-10-14 34 views
34

¿Hay una forma de plataforma de base de datos cruzada para obtener la clave principal del registro que acaba de insertar?¿Clave principal de la fila insertada jdbc?

señalé que this answer dice que se puede obtener mediante una llamada SELECT LAST_INSERT_ID() y creo que se puede llamar SELECT @@IDENTITY AS 'Identity'; hay una manera común de hacerlo al otro lado de las bases de datos de JDBC?

Si no, ¿cómo sugeriría implementar esto para un fragmento de código que podría acceder a cualquiera de SQL Server, MySQL y Oracle?

Respuesta

45

Copiado 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); 
} 

Hope esto le da un buen punto de partida.

+0

Funciona con Postgres, pero no con Oracle –

+0

En Sybase ASE esto solo funciona si ha instalado las tablas de acceso o información de metadatos. De lo contrario, debes usar '@@ identity'. – danny

1

para oráculo, Hibernate usa NEXT_VALUE de una secuencia si ha mapeado una secuencia para la generación de valor PKEY.

No está seguro de lo que hace por el servidor MySQL o MS SQL

1

Spring proporciona un apoyo útil para this operation y la guía de referencia parece responder a su pregunta:

No hay una sola manera estándar para crear una adecuada PreparedStatement (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 allí también, pero no puedo hablar por otras plataformas.

1

Para bases de datos que cumplen con SQL-99, puede utilizar las columnas de identidad: CREAR TABLA alguna_tabla (INTEGER ID generado SIEMPRE COMO IDENTIDAD (comience con 101) PRIMARY KEY, ...

Uso getGeneratedKeys() para recuperar el clave que se acaba de insertar con executeUpdate(String sql, int autoGeneratedKeys). Utilice Statement.RETURN_GENERATED_KEYS de segundo parámetro a executeUpdate() respuesta

19

de extraneon, aunque correcta, no funciona para Oracle.

La forma de hacer 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); 
} 
+0

Funcionó para mí con Oracle 11g Express y Java 8. –

+1

¡Funcionó! Uno debe prestar especial atención a 'rs.getLong (1)' debe proporcionar el índice y no el nombre – SashikaXP

-2

Sólo declaran la columna ID como entero ID No NULL clave primaria auto_increment

después de esta ejecución de 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(); 

lo anterior código le mostrará la identificación de la fila actual

si rem ove ds.last() de lo que mostrará todos los valores de la columna

Cuestiones relacionadas