Первичный ключ из вставленной строки jdbc?
Вопрос
Существует ли межплатформенный способ получить первичный ключ только что вставленной записи?
Я заметил, что этот ответ говорит, что вы можете получить его, позвонив SELECT LAST_INSERT_ID()
и я думаю, что ты можешь позвонить SELECT @@IDENTITY AS 'Identity';
есть ли общий способ сделать это в базах данных в jdbc?
Если нет, то как бы вы предложили мне реализовать это для фрагмента кода, который мог бы получить доступ к любому из SQL Server, MySQL и Oracle?
Решение
Скопировано из моего кода:
pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS);
где pInsertOid — подготовленный оператор.
затем вы можете получить ключ:
// fill in the prepared statement and
pInsertOid.executeUpdate();
ResultSet rs = pInsertOid.getGeneratedKeys();
if (rs.next()) {
int newId = rs.getInt(1);
oid.setId(newId);
}
Надеюсь, это послужит вам хорошей отправной точкой.
Другие советы
ответ extraneon, хотя и правильный, не работает для Oracle.
Для Oracle это можно сделать так:
String key[] = {"ID"}; //put the name of the primary key column
ps = con.prepareStatement(insertQuery, key);
ps.executeUpdate();
rs = ps.getGeneratedKeys();
if (rs.next()) {
generatedKey = rs.getLong(1);
}
Вы пробовали Заявление.executeUpdate() и Statement.getGeneratedKeys() методы?Eсть Статья на DeveloperWorks там упоминается подход.
Кроме того, в JDBC 4.0 Sun добавила функция row_id это позволяет вам получить уникальный дескриптор строки.Эта функция поддерживается Oracle и DB2.Для сервера sql вам, вероятно, понадобится сторонний драйвер, например Вот этот.
Удачи!
для oracle Hibernate использует NEXT_VALUE из последовательности, если вы сопоставили последовательность для генерации значения PKEY.
Не уверен, что он делает для сервера MySQL или MS SQL.
Spring предоставляет некоторую полезную поддержку для эта операция и справочное руководство, кажется, отвечает на ваш вопрос:
Не существует стандартного единственного способа создания подходящего подготовленного предприятия (что объясняет, почему подпись метода является таким, каким он есть).Примером, который работает на Oracle и может не работать на других платформах, является ...
Я протестировал этот пример на MySQL, и там он тоже работает, но о других платформах говорить не могу.
Для баз данных, соответствующих SQL-99, вы можете использовать столбцы идентификаторов:CREATE TABLE sometable (id INTEGER GENERATED ALWAYS AS IDENTITY (НАЧИНАЕТСЯ С 101) ПЕРВИЧНЫЙ КЛЮЧ, ...
Использовать getGeneratedKeys() чтобы получить ключ, который был только что вставлен с помощью ExecuteUpdate (String sql, int autoGeneratedKeys).Используйте Statement.RETURN_GENERATED_KEYS для второго параметра для выполненияUpdate()
Просто объявите столбец идентификатора как целое число идентификатора, а не NULL-первичный ключ. auto_increment
после этого выполните этот код
ResultSet ds=st.executeQuery("select * from user");
while(ds.next())
{
ds.last();
System.out.println("please note down your registration id which is "+ds.getInt("id"));
}
ds.close();
приведенный выше код покажет вам идентификатор текущей строки
если ты удалишь ds.last()
чем он покажет все значения столбца id