Question

Existe-t-il un moyen de plate-forme inter-bases de données pour obtenir la clé primaire de l'enregistrement que vous venez d'insérer?

J'ai noté que cette réponse indique 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 de la sorte à travers des bases de données dans jdbc?

Sinon, comment suggérez-vous que je l'implémente pour un morceau de code pouvant accéder à SQL Server, MySQL et Oracle?

Était-ce utile?

La solution

Copié à partir 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.

Autres conseils

La réponse de

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

Pour Oracle, 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);
}

Avez-vous essayé la Statement.executeUpdate () et Méthodes Statement.getGeneratedKeys () ? Il existe un article de developerWorks qui mentionne l'approche.

De plus, dans JDBC 4.0, Sun a ajouté le fonctionnalité row_id qui vous permet d'obtenir un descripteur unique sur une ligne. Cette fonctionnalité 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!

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 que cela fait pour MySQL ou le serveur MS SQL

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 simple standard pour   créer un approprié   PreparedStatement (qui explique pourquoi   la signature de la méthode est la façon dont il   est). Un exemple qui fonctionne sur Oracle   et peut ne pas fonctionner sur d'autres plateformes   est ...

J'ai testé cet exemple sur MySQL et ça marche là aussi, mais je ne peux pas parler pour d'autres plateformes.

Pour les bases de données conformes à SQL-99, vous pouvez utiliser des colonnes d'identité: CREATE TABLE sometable (id INTEGER GÉNÉRÉ TOUJOURS COMME IDENTITÉ (DÉBUT AVEC 101), PRIMARY KEY, ...

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

Il suffit de déclarer la colonne id en tant qu’entier id pas la clé primaire NULL auto_increment

après cela, exécutez 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();

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

si vous supprimez ds.last () , toutes les valeurs de la colonne id seront affichées

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top