2008-10-19 13 views
12

Jaki jest najlepszy sposób uzyskania ostatniego wstawionego identyfikatora przy użyciu języka sqlite z języka Java? Google daje mi różne odpowiedzi - niektórzy mówią, wybierz ostatni-wstaw-rowid; inni mówią call statement.getGeneratedKeys(). Jaka jest najlepsza droga do pokonania? (Chcę tylko zwrócić identyfikator, nie używać go do innych wkładek lub czegokolwiek.)Jaki jest najlepszy sposób uzyskania ostatniego wstawionego identyfikatora przy użyciu języka sqlite z języka Java?

Odpowiedz

9

Użyj funkcji getGeneratedKeys(), jeśli obsługuje ją sterownik JDBC. Nie chcesz się obijać, próbując zdobyć klucz po wstawieniu. Jeśli twój sterownik nie obsługuje getGeneratedKeys(), to dostanę następną wartość z klucza przed wstawieniem.

+0

w jaki sposób to "następna wartość z klucza przed wstawką" większa niż "największa wartość po wstawieniu"? Oba mają ten sam typ wyścigu i oba polegają na monotonicznych, pojedynczych przyrostach klucza. –

+0

Założeniem jest, że klucz pobrany przed wstawieniem nie byłby oparty na zapytaniu tabeli docelowej, ale od jakiegoś kluczowego dostawcy. W kategoriach Oracle byłoby to Select sequence_name.nextval z dual. Nie znam szczegółów dla SQL Lite, ale niektóre wywołania api, które zwracają klucz w jego własnej autonomicznej transakcji całkowicie niezależnej od wstawki. Powiedział ... użyj getGeneratedKeys(). –

+0

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

20

Każda z metod wykonuje dokładnie tę samą instrukcję SQL, ale java.sql.Statement.getGeneratedKeys() jest bardziej przenośna dla różnych baz danych.

Używanie funkcji API C sqlite3_last_insert_rowid() lub funkcji SQL last_insert_rowid() jest poprawnym sposobem pobrania wiersza wygenerowanego podczas ostatniego wstawienia.

SQLite obsługuje składni SQL scalar function jak:

SELECT function-name(); 

Dlatego też, jeśli nie masz dostępu do katalogu C API bezpośrednio, można wywołać funkcję skalarną last_insert_rowid() poprzez SELECT oświadczeniu.

Jeśli spojrzeć na source code na realizację SQLiteJDBC (jest to co używasz?) Widać, że to jest dokładnie to, co autor tej owijki JDBC uczynił:

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