2010-04-15 14 views
13

Moja obecna metoda jest taka:SQL (Java, h2): Jaki jest najlepszy sposób na odzyskanie unikalnego identyfikatora pojedynczego elementu, który właśnie wstawiłem do mojej bazy danych?

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC 

Zakłada to najnowszy wstawiony element ma zawsze najwyższy unikalny identyfikator (klucz podstawowy, Autoinkrementacja). Coś tu nie pasuje.

Alternatywy?

+0

FYI, prawie duplikat Pytanie: [Czy istnieje sposób, aby pobrać identyfikator autoIncrement z przygotowanym oświadczeniu] (http://stackoverflow.com/q/1376218/642706) –

Odpowiedz

22

Jeśli t Sterownik JDBC go obsługuje, możesz również użyć do tego celu Statement#getGeneratedKeys().

String sql = "INSERT INTO tbl (col) VALUES (?)"; 
preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
preparedStatement.setString(1, col); 
preparedStatement.executeUpdate(); 
generatedKeys = preparedStatement.getGeneratedKeys(); 
if (generatedKeys.next()) { 
    long id = generatedKeys.getLong(1); 
} else { 
    // Throw exception? 
} 
+0

Zobaczmy, czy to działa ... –

+1

Do mojego doświadczenia i wiedzy, wszystkie aktualne wersje sterowników JDBC głównych serwerów RDBMS, takich jak MySQL, MSSQL, PostgreSQL, Oracle i DB2, obsługują to (zajęło to trochę czasu dla Oracle i PostgreSQL, aż około rok temu nie poparli tego). Niestety nie mam doświadczenia z H2, więc nie mogę powiedzieć z góry, ale szybkie spojrzenie na Google dowiaduje się, że to wspiera. – BalusC

+0

Okay świetnie, działa! Czy jest to lepsze niż TOŻSAMOŚĆ()? –

5

Jeśli MySQL można zrobić

select last_insert_id(); 

przypadku korzystania MS SQL

select scope_identity(); 

Dla H2, wierzę, że to

CALL SCOPE_IDENTITY(); 

ale nie mam żadnego doświadczenia z to DB

+0

Hmm. Zastanawiam się, czy istnieje odpowiednik H2 ... –

+0

Niestety, początkowo nie widziałem tagu h2. Zaktualizowałem moją odpowiedź z tym, co uważam za równoważne. – Sean

+0

Cóż, będę wstawiał z instancjami PreparedStatement w Javie, więc może potrzebuję zamiast tego IDENTITY(). Ale tak, to powinno wystarczyć. Dzięki. –