2008-10-19 14 views

Antwort

9

Verwenden Sie getGeneratedKeys(), wenn Ihr JDBC-Treiber es unterstützt. Du willst nicht herumprobieren und versuchen, den Schlüssel nach dem Einfügen selbst zu bekommen. Wenn Ihr Treiber getGeneratedKeys() nicht unterstützt, würde ich den nächsten Wert vom Schlüssel vor der Einfügung erhalten.

+0

Auf welche Weise ist "der nächste Wert vom Schlüssel vor dem Einfügen" besser als "der größte Wert nach dem Einfügen"? Beide haben die gleiche Art von Race Condition, und beide verlassen sich auf monotone, einzelne Inkremente des Schlüssels. –

+0

Die Annahme ist, dass der vor dem Einfügen abgerufene Schlüssel nicht auf einer Abfrage der Zieltabelle basiert, sondern von einem Schlüsselanbieter. In Oracle-Begriffen wäre Select sequence_name.nextval von dual. Ich kenne nicht die Einzelheiten für SQL-Lite, aber einige API-Aufruf, der einen Schlüssel in seiner eigenen autonomen Transaktion vollständig unabhängig von der Einfügung zurückgibt. Das sagte ... benutze getGeneratedKeys(). –

+0

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

20

Beide Ansätze führen dieselbe exakte SQL-Anweisung aus, aber java.sql.Statement.getGeneratedKeys() ist portabler für verschiedene zugrunde liegende Datenbanken.

Verwenden Sie entweder die sqlite3_last_insert_rowid() C-API-Funktion oder die last_insert_rowid() SQL-Funktion ist die richtige Möglichkeit zum Abrufen der Rowid generiert während der letzten Einfügung.

SQLite unterstützt die SQL scalar function Syntax:

SELECT function-name(); 

Deshalb, wenn Sie Zugriff auf den C-API nicht direkt haben, können Sie die Skalarfunktion last_insert_rowid() über eine SELECT Anweisung aufrufen.

Wenn man sich die source code für die SQLiteJDBC Umsetzung aussehen (das ist, was Sie verwenden?) Sie werden sehen, dass dies genau das ist, was der Autor dieses JDBC-Wrapper getan hat:

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