2008-10-14 145 views
34

是否有跨數據庫平臺的方式來獲取剛剛插入的記錄的主鍵?插入行jdbc的主鍵?

我注意到this answer表示你可以通過調用SELECT LAST_INSERT_ID()得到它,我認爲你可以調用SELECT @@IDENTITY AS 'Identity';有沒有一種常見的方法來在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,如果您已經爲PKEY值生成映射了一個序列,Hibernate將使用序列中的NEXT_VALUE。

不知道它做什麼的MySQL或MS SQL服務器

1

Spring提供了一些有用的支持this operation和參考指南似乎回答你的問題:

沒有一個標準的單一方式 創建一個適當的 PreparedStatement的(這可以解釋爲什麼 的方法簽名它的方式是 )。這對甲骨文 工作,不得在其他平臺上 是工作的一個例子...

我測試過在MySQL這個例子中,它在那裏工作過,但我不能在其他平臺上說話。

19

extraneon的答案,雖然正確,不適合甲骨文工作。

您甲骨文做到這一點的方法是:

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列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列的所有值