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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top