web-dev-qa-db-fra.com

Clé primaire de la ligne insérée jdbc?

Existe-t-il un moyen de plateforme croisée pour obtenir la clé primaire de l'enregistrement que vous venez d'insérer?

J'ai noté que cette réponse dit que vous pouvez l'obtenir en appelant SELECT LAST_INSERT_ID() et je pense que vous pouvez appeler SELECT @@IDENTITY AS 'Identity'; Existe-t-il un moyen courant de procéder à cette opération dans plusieurs bases de données dans jdbc?

Sinon, comment suggéreriez-vous que j'implémente ceci pour un morceau de code qui pourrait accéder à n'importe lequel de SQL Server, MySQL et Oracle?

42
Omar Kooheji

Copié de mon code:

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

où pInsertOid est une instruction préparée.

vous pouvez alors 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);
}

J'espère que cela vous donne un bon point de départ.

55
extraneon

réponse d'Extraneon, bien que correcte, ne fonctionne pas pour Oracle.

Pour Oracle, vous procédez comme suit:

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);
}
23
atripathi

Avez-vous essayé les méthodes Statement.executeUpdate () et Statement.getGeneratedKeys () ? Il y a un article developerWorks qui mentionne l'approche.

En outre, dans JDBC 4.0, Sun a ajouté la fonction row_id qui vous permet d'obtenir une poignée unique sur une ligne. La fonction est prise en charge par Oracle et DB2. Pour le serveur SQL, vous aurez probablement besoin d'un pilote tiers tel que celui-ci .

Bonne chance!

3
johnstok

pour Oracle, Hibernate utilise NEXT_VALUE à partir d'une séquence si vous avez mappé 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
anjanb

Spring fournit un support utile pour cette opération et le guide de référence semble répondre à votre question:

Il n'existe pas de méthode unique standard pour créer un PreparedStatement approprié (ce qui explique pourquoi la signature de la méthode est telle qu'elle 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 il fonctionne là aussi, mais je ne peux pas parler pour d'autres plates-formes.

1
Dónal

Pour les bases de données conformes à SQL-99, vous pouvez utiliser des colonnes d'identité: CREATE TABLE someable (id INTEGER GENERATED TOUJOURS AS IDENTITY (START WITH 101) PRIMARY KEY, ...

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

1
Jeff Miller