2008-10-14 4 views
34

Есть ли способ перекрестной базы данных для получения первичного ключа записи, которую вы только что вставили?Первичный ключ из вставленной строки jdbc?

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

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

ответ

45

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

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

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

+0

Работает с Postgres, но не с Oracle – 2016-03-14 15:22:20

+0

В Sybase ASE это работает, только если вы установили таблицы информации о доступе к метаданным. В противном случае вы должны использовать `@@ identity`. – danny 2016-09-09 08:32:33

1

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

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

3

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

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

Удачи вам!

1

Spring обеспечивает некоторую полезную поддержку this operation и справочное руководство, кажется, ответ на ваш вопрос:

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

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

1

Для баз данных, которые соответствуют SQL-99, вы можете использовать столбцы идентификации: CREATE TABLE sometable (ID INTEGER GENERATED ВСЕГДА AS IDENTITY (START WITH 101) PRIMARY KEY, ...

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

19

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

Просто объявить столбец ID целочисленный идентификатор не 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(); 

выше код покажет вам идентификатор текущей строки

если вы rem ove ds.last(), чем он будет показывать все значения столбца id