2008-10-14 9 views
34

Existe-t-il une plate-forme de base de données croisée pour obtenir la clé primaire de l'enregistrement que vous venez d'insérer?Clé primaire de la ligne insérée jdbc?

J'ai noté que this answer dit que vous pouvez l'obtenir en appelant SELECT LAST_INSERT_ID() et je pense que vous pouvez appeler SELECT @@IDENTITY AS 'Identity'; est-il un moyen courant de faire cela à travers les bases de données dans jdbc?

Sinon, comment proposeriez-vous je mets en œuvre cela pour un morceau de code qui pourrait accéder à un de SQL Server, MySQL et Oracle?

Répondre

45

Copié de mon code:

pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS); 

où pInsertOid est une déclaration préparée.

vous pouvez obtenir la clé:

// fill in the prepared statement and 
pInsertOid.executeUpdate(); 
ResultSet rs = pInsertOid.getGeneratedKeys(); 
if (rs.next()) { 
    int newId = rs.getInt(1); 
    oid.setId(newId); 
} 

Espérons que cela vous donne un bon point de départ.

+0

Fonctionne avec Postgres, mais pas avec Oracle –

+0

Sur Sybase ASE, cela fonctionne uniquement si vous avez installé les tables d'informations sur l'accesseur de métadonnées. Sinon, vous devez utiliser '@@ identity'. – danny

1

pour Oracle, Hibernate utilise NEXT_VALUE d'une séquence si vous avez tracé une séquence pour la génération de valeur PKEY.

Je ne sais pas ce qu'il fait pour MySQL ou MS SQL Server

1

Spring fournit un soutien utile pour this operation et le guide de référence semble répondre à votre question:

Il n'y a pas un moyen standard unique pour créer un approprié PreparedStatement (ce qui explique pourquoi la signature de méthode est la façon dont c'est est). Un exemple qui fonctionne sur Oracle et peut ne pas fonctionner sur d'autres plates-formes est ...

J'ai testé cet exemple sur MySQL et cela fonctionne là aussi, mais je ne peux pas parler pour les autres plates-formes.

1

Pour les bases de données qui sont conformes à SQL-99, vous pouvez utiliser des colonnes d'identité: CREATE TABLE sometable (id GÉNÉRÉ TOUJOURS EN ENTIER IDENTITÉ (COMMENCER 101) clé primaire, ...

Utilisez getGeneratedKeys() pour récupérer la clé qui vient d'être inséré avec executeUpdate(String sql, int autoGeneratedKeys). Utilisez Statement.RETURN_GENERATED_KEYS pour le 2ème paramètre à executeUpdate() la réponse de

19

extraneon, bien que correct, ne fonctionne pas pour Oracle.

La façon dont vous faites cela pour Oracle est:

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

A travaillé pour moi avec Oracle 11g Express et Java 8. –

+1

A travaillé! On devrait accorder une attention particulière à 'rs.getLong (1)' vous devez fournir l'index et non le nom – SashikaXP

-2

simplement déclarer colonne id comme id integer NULL clé primaire auto_increment

après exécuter ce code

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(); 

ci-dessus le code vous montrera l'ID de la ligne en cours

si vous rem

Questions connexes