2010-04-15 12 views
13

Meine aktuelle Methode ist folgende:SQL (Java, h2): Wie kann die eindeutige ID des einzelnen Elements, das ich gerade in meine Datenbank eingefügt habe, am besten abgerufen werden?

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC 

dies das letzte eingefügte Element übernimmt hat immer die höchste eindeutige ID (Primärschlüssel, selbstinkrementierende). Etwas riecht hier falsch.

Alternativen?

+0

FYI, fast doppelte Frage: [Gibt es eine Möglichkeit, die Autoinkrement-ID aus einer vorbereiteten Erklärung zum Abrufen] (http://stackoverflow.com/q/1376218/642706) –

Antwort

22

Wenn t Der JDBC-Treiber unterstützt es, Sie können auch einfach Statement#getGeneratedKeys() dafür verwenden.

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

Lassen Sie mich sehen, ob das funktioniert ... –

+1

Nach meiner Erfahrung und Wissen, alle aktuellen JDBC Treiberversionen der wichtigsten RDBMS Server wie MySQL, MSSQL, PostgreSQL, Oracle und DB2 unterstützt es (es dauerte eine Weile für Oracle und PostgreSQL, bis vor etwa einem Jahr haben sie es nicht unterstützt). Leider habe ich keine Erfahrung mit H2, also kann ich das nicht von oben sagen, aber ein kurzer Blick auf Google erfährt, dass es das unterstützt. – BalusC

+0

Okay, großartig, es funktioniert! Ist das aber besser als IDENTITY()? –

5

Wenn MySQL verwenden Sie

select last_insert_id(); 

Bei der Verwendung von MS SQL

select scope_identity(); 

Für H2 tun kann, ich glaube, es

CALL SCOPE_IDENTITY(); 

ist, aber ich habe keine Erfahrung mit dass DB

+0

Hmm. Ich frage mich, ob es ein H2-Äquivalent gibt ... –

+0

Sorry, habe das h2-Tag zunächst nicht gesehen. Aktualisierte meine Antwort mit dem, was ich für gleichwertig halte. – Sean

+0

Nun, ich werde mit PreparedStatement-Instanzen in Java einfügen, also brauche ich vielleicht IDENTITY(). Aber ja, das sollte es tun. Vielen Dank. –