views:

148

answers:

2

My current method is this:

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC

This assumes the latest inserted item always has the highest unique ID (primary key, autoincrementing). Something smells wrong here.

Alternatives?

+1  A: 

If using MySQL you can do

select last_insert_id();

If using MS SQL

select scope_identity();

For H2, I believe it's

CALL SCOPE_IDENTITY();

but I don't have any experience with that DB

Sean
Hmm. I wonder if there's an H2 equivalent...
Daddy Warbox
Sorry, didn't see the h2 tag initially. Updated my answer with what I believe to be the equivalent.
Sean
Well I will be inserting with PreparedStatement instances in Java, so I might need IDENTITY() instead. But yeah, that should do it. Thanks.
Daddy Warbox
+5  A: 

If the JDBC driver supports it, you can also just use Statement#getGeneratedKeys() for that.

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?
}
BalusC
Let me see if this works...
Daddy Warbox
To my experience and knowledge, all current JDBC driver versions of the major RDBMS servers like MySQL, MSSQL, PostgreSQL, Oracle and DB2 supports it (it took a while for Oracle and PostgreSQL, up to about one year ago they didn't support it). Unfortunately I don't have experience with H2, so I can't tell from top of head, but a quick glance on Google learns me that it does support it.
BalusC
Okay great it works! Is this better than IDENTITY(), though?
Daddy Warbox
It *does* `IDENTITY()` "under the hoods", but now in a more abstract and DB-agnostic way using pure JDBC API. You have less maintenance headache whenever you'd like to switch of database. If you did it all the right and standard-SQL way, then all you basically need to do is to replace JDBC driver and URL/login. You can keep the coding intact.
BalusC