Первичный ключ из вставленной строки JDBC? - PullRequest
38 голосов
/ 14 октября 2008

Существует ли кросс-платформенный способ получения первичного ключа только что вставленной записи?

Я заметил, что этот ответ говорит, что вы можете получить его, позвонив по номеру SELECT LAST_INSERT_ID(), и я думаю, что вы можете позвонить SELECT @@IDENTITY AS 'Identity';. Существует ли распространенный способ сделать это через базы данных в jdbc?

Если нет, то как бы вы предложили мне реализовать это для кода, который мог бы получить доступ к любому из SQL Server, MySQL и Oracle?

Ответы [ 7 ]

50 голосов
/ 14 октября 2008

Скопировано из моего кода:

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);
}

Надеюсь, это даст вам хорошую отправную точку.

22 голосов
/ 14 декабря 2012

ответ 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);
}
3 голосов
/ 15 октября 2008

Вы пробовали методы Statement.executeUpdate () и Statement.getGeneratedKeys () ? Существует статья developerWorks , в которой упоминается подход.

Кроме того, в JDBC 4.0 Sun добавила функцию row_id , которая позволяет вам получить уникальный дескриптор строки. Эта функция поддерживается Oracle и DB2. Для сервера sql вам, вероятно, понадобится сторонний драйвер, такой как этот .

Удачи!

1 голос
/ 27 сентября 2011

Для баз данных, которые соответствуют SQL-99, вы можете использовать столбцы идентификаторов: CREATE TABLE sometable (идентификатор INTEGER ВСЕГДА СОЗДАН В КАЧЕСТВЕ ИДЕНТИЧНОСТИ (НАЧНИТЕ С 101) ПЕРВИЧНЫЙ КЛЮЧ, ...

Используйте getGeneratedKeys () , чтобы получить ключ, который был только что вставлен с помощью executeUpdate (String sql, int autoGeneratedKeys) . Используйте Statement.RETURN_GENERATED_KEYS для второго параметра для executeUpdate ()

1 голос
/ 17 октября 2008

Spring предоставляет некоторую полезную поддержку для этой операции и справочное руководство, кажется, ответит на ваш вопрос:

Не существует единого стандартного способа создать соответствующий PreparedStatement (который объясняет, почему сигнатура метода такова является). Пример, который работает на Oracle и может не работать на других платформах это ...

Я тестировал этот пример на MySQL, и он тоже там работает, но я не могу говорить о других платформах.

1 голос
/ 15 октября 2008

для оракула, Hibernate использует NEXT_VALUE из последовательности, если вы отобразили последовательность для генерации значения PKEY.

Не уверен, что он делает для сервера MySQL или MS SQL

0 голосов
/ 31 июля 2015

Просто объявите столбец идентификатора как целое число идентификатора, а не первичный ключ 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...