2010-04-15 2 views
13

Мой текущий метод заключается в следующем:SQL (Java, h2): Каков наилучший способ получить уникальный идентификатор единственного элемента, который я только что вставил в свою базу данных?

SELECT TOP 1 ID FROM DATAENTRY ORDER BY ID DESC 

Это предполагает последний добавленный элемент всегда имеет самый высокий уникальный идентификатор (первичный ключ, автоинкрементом). Здесь что-то плохое.

Альтернативы?

+0

FYI, почти дубликат Вопрос: [Есть ли способ, чтобы получить автоинкрементный идентификатор из подготовленного заявления] (http://stackoverflow.com/q/1376218/642706) –

ответ

22

Если t он поддерживает драйвер JDBC, вы также можете использовать для этого 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

Позвольте мне посмотреть, работает ли это ... –

+1

К моему опыту и знаниям все текущие версии драйверов JDBC для основных серверов RDBMS, таких как MySQL, MSSQL, PostgreSQL, Oracle и DB2, поддерживают его (потребовалось время для Oracle и PostgreSQL, вверх примерно год назад они этого не поддерживали). К сожалению, у меня нет опыта работы с H2, поэтому я не могу сказать с самого начала, но быстрый взгляд на Google узнает меня, что он его поддерживает. – BalusC

+0

Хорошо, отлично! Это лучше, чем IDENTITY()? –

5

При использовании MySQL вы можете сделать

select last_insert_id(); 

При использовании MS SQL

select scope_identity(); 

Для Н2, я считаю, что это

CALL SCOPE_IDENTITY(); 

, но у меня нет никакого опыта работы с что БД

+0

Хм. Интересно, есть ли эквивалент H2 ... –

+0

Извините, я не видел тег h2 изначально. Обновленный мой ответ с тем, что я считаю эквивалентным. – Sean

+0

Ну, я буду вставлять экземпляры PreparedStatement в Java, поэтому мне может понадобиться IDENTITY(). Но да, это должно сделать это. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^