2008-10-19 5 views
12

Quelle est la meilleure façon d'obtenir le dernier identifiant inséré en utilisant sqlite de Java? Google me donne des réponses différentes - certains disent sélectionner le dernier-insert-rowid; d'autres disent appel statement.getGeneratedKeys(). Quelle est la meilleure route à prendre? (Je veux juste retourner l'identifiant, ne pas l'utiliser pour d'autres insertions ou quoi que ce soit.)Quelle est la meilleure façon d'obtenir le dernier identifiant inséré en utilisant sqlite de Java?

Répondre

9

Utilisez getGeneratedKeys() si votre pilote JDBC le prend en charge. Vous ne voulez pas essayer de récupérer la clé après l'insertion. Si votre pilote ne supporte pas getGeneratedKeys() alors j'obtiendrais la valeur suivante de la clé avant l'insertion.

+0

De quelle façon est-ce que "la prochaine valeur de la clé avant l'insertion" est meilleure que "la plus grande valeur après l'insertion"? Les deux ont le même type de condition de concurrence, et tous deux reposent sur des incréments monotones et uniques de la clé. –

+0

L'hypothèse est que la clé récupérée avant l'insertion ne serait basée sur aucune requête de la table cible, mais provenant d'un fournisseur de clés. En termes Oracle, ce serait Select sequence_name.nextval de dual. Je ne connais pas les détails pour SQL Lite mais certains appels api qui renvoient une clé dans sa propre transaction autonome complètement indépendante de l'insert. Cela dit ... utilisez getGeneratedKeys(). –

+0

row = stmt.getGeneratedKeys(). GetInt (1); –

20

Chaque approche exécute la même instruction SQL exacte, mais java.sql.Statement.getGeneratedKeys() est plus portable pour différentes bases de données sous-jacentes.

L'utilisation de la fonction API sqlite3_last_insert_rowid() C ou de la fonction SQL last_insert_rowid() est la méthode correcte pour récupérer le rowid généré lors de la dernière insertion.

SQLite prend en charge la syntaxe SQL scalar function comme:

SELECT function-name(); 

Par conséquent, si vous n'avez pas accès à l'API C directement, vous pouvez appeler la fonction scalaire last_insert_rowid() via une déclaration SELECT.

Si vous regardez le source code pour la mise en œuvre SQLiteJDBC (est-ce que vous utilisez?), Vous verrez que c'est exactement ce que l'auteur de cette enveloppe JDBC a fait:

ResultSet getGeneratedKeys() throws SQLException { 
    if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement(
     "select last_insert_rowid();"); 
    return getGeneratedKeys.executeQuery(); 
} 
Questions connexes