Chiave primaria dalla riga inserita jdbc?
Domanda
Esiste un modo multipiattaforma per ottenere la chiave primaria del record che hai appena inserito?
Ho notato che questa risposta dice che puoi ottenerlo chiamando SELECT LAST_INSERT_ID ()
e penso che puoi chiamare SELECT @@ IDENTITY AS 'Identity';
c'è un modo comune per fare questo attraverso i database in jdbc?
In caso contrario, come suggeriresti di implementarlo per un pezzo di codice che potrebbe accedere a uno qualsiasi di SQL Server, MySQL e Oracle?
Soluzione
Copiato dal mio codice:
pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS);
dove pInsertOid è un'istruzione preparata.
è quindi possibile ottenere la chiave:
// fill in the prepared statement and
pInsertOid.executeUpdate();
ResultSet rs = pInsertOid.getGeneratedKeys();
if (rs.next()) {
int newId = rs.getInt(1);
oid.setId(newId);
}
Spero che questo ti dia un buon punto di partenza.
Altri suggerimenti
la risposta di extraneon, sebbene corretta, non funziona per Oracle .
Il modo in cui lo fai per Oracle è:
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);
}
Hai provato la Statement.executeUpdate () e Metodi Statement.getGeneratedKeys () ? Esiste un developerWorks articolo che menziona l'approccio.
Inoltre, in JDBC 4.0 Sun ha aggiunto funzione row_id che ti consente di ottenere un handle unico su una riga. La funzione è supportata da Oracle e DB2. Per il server sql probabilmente avrai bisogno di un driver di terze parti come questo .
Buona fortuna!
per l'oracolo, Hibernate utilizza NEXT_VALUE da una sequenza se è stata mappata una sequenza per la generazione di valore PKEY.
Non sono sicuro di cosa faccia per il server MySQL o MS SQL
Spring fornisce un utile supporto per questa operazione e la guida di riferimento sembra rispondere alla tua domanda:
Non esiste un solo modo standard per creare un appropriato PreparedStatement (che spiega perché la firma del metodo è così è). Un esempio che funziona su Oracle e potrebbe non funzionare su altre piattaforme è ...
Ho provato questo esempio su MySQL e funziona anche lì, ma non posso parlare per altre piattaforme.
Per i database conformi a SQL-99, è possibile utilizzare le colonne di identità: CREA TABELLA qualcosa (ID INTEGER GENERATO SEMPRE COME IDENTITÀ (INIZIA CON 101) CHIAVE PRIMARIA, ...
Usa getGeneratedKeys () per recuperare la chiave appena inserita con executeUpdate (String sql, int autoGeneratedKeys) . Usa Statement.RETURN_GENERATED_KEYS per il 2o parametro per executeUpdate ()
Dichiara semplicemente la colonna id come numero intero id non chiave primaria NULL auto_increment
dopo eseguire questo codice
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();
il codice sopra ti mostrerà l'ID della riga corrente
se rimuovi ds.last ()
di quanto mostrerà tutti i valori della colonna id