55 votes

Comment obtenir une valeur de la dernière ligne insérée?

Est-il possible d'obtenir une valeur à partir de la dernière ligne insérée?

J'insère une ligne où la PK augmentera automatiquement et j'aimerais obtenir cette PK. Seul le PK est garanti d'être unique dans la table.

J'utilise Java avec JDBC et PostgreSQL.

59voto

Luc M Points 4950

PostgresSQL - RETOURNER

 INSERT INTO mytable( field_1, field_2,... )
VALUES ( value_1, value_2 ) RETURNING anyfield
 

Il retournera la valeur de "anyfield". "anyfield" peut être une séquence ou non.

J'espère que ça aide

28voto

Andrew Watt Points 1509

Voir la documentation de l'API pour java.sql.Statement .

Fondamentalement, lorsque vous appelez executeUpdate() ou executeQuery() , utilisez la constante Statement.RETURN_GENERATED_KEYS . Vous pouvez ensuite appeler getGeneratedKeys pour obtenir les clés générées automatiquement de toutes les lignes créées par cette exécution. (En supposant que votre pilote JDBC le fournisse.)

Cela va dans le sens de ceci:

 Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();
 

16voto

anjanb Points 5579

Si vous utilisez JDBC 3.0, vous pouvez obtenir la valeur du PK dès que vous l’avez insérée.

Voici un article qui explique comment: https://www.ibm.com/developerworks/java/library/j-jdbcnew/

 Statement stmt = conn.createStatement();
// Obtain the generated key that results from the query.
stmt.executeUpdate("INSERT INTO authors " +
                   "(first_name, last_name) " +
                   "VALUES ('George', 'Orwell')",
                   Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
    // Retrieve the auto generated key(s).
    int key = rs.getInt(1);
}
 

11voto

BalusC Points 498232

Depuis PostgreSQL pilote JDBC version 8.4-701 l' PreparedStatement#getGeneratedKeys() est enfin pleinement fonctionnelle. Nous l'utilisons ici presque un an dans la production de notre entière satisfaction.

Dans la "plaine JDBC" l' PreparedStatement doit être créé comme suit pour se rendre à la remise des clés:

statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

Vous pouvez télécharger l'actuel pilote JDBC version ici (ce qui est pour le moment encore 8.4-701).

8voto

svrist Points 3408

Les séquences dans postgresql sont sûr pour les transactions. Ainsi, vous pouvez utiliser le

currval(sequence)

Citation:

currval

De retour, la valeur la plus récemment obtenue par nextval pour cette séquence dans la session en cours. (Une erreur est signalé si nextval n'a jamais été appelé pour cette séquence dans ce session.) Notez que parce que c'est de retour d'une session de valeur locale, il donne une réponse prévisible même si d'autres sessions sont en cours d'exécution nextval pendant ce temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X