2011-09-29 37 views
2

它看起來像火鳥不支持的getGeneratedKeys()你有一個AUTO_INCREMENT列執行插入之後。所以我想了解在插入後如何讓我的手在生成的密鑰上。火鳥+ JDBC:獲取生成的密鑰自刀片

1)我必須使用「插入到用戶(...)VALUES(...)返回ID」,並通過一個CallableStatement以獲取生成的ID叫這個?究竟如何?我需要圍繞「呼叫{...}」來包裹我的插入嗎?2)是否有一些其他方法可以在Firebird下獲取生成的ID,某種「select last_id_generated()」。 「從用戶選擇最大(id)」不計算。

3)難道真的是的getGeneratedKeys()不是由火鳥JDBC驅動程序支持? (可選)

謝謝!

+0

這個帖子可能會有幫助:http://tech.dir.groups.yahoo.com/group/Firebird-Java/message/10170 –

+0

謝謝,但帖子有點含糊。在那裏我不清楚如何使用JDBC來獲取它。 – TraderJoeChicago

回答

2

事實證明,所有你需要做的就是打電話,而不是「插入......」回用的executeQuery(從PreparedStatement的)的executeUpdate。這將從您可以獲取生成的ID的位置返回您的ResultSet。我從來沒有想過你可以用executeQuery調用INSERT。我以爲你必須執行executeUpdate。

+0

Firebird本身將INSERT ... RETURNING 作爲查詢生成結果集。由於getGeneratedKeys()沒有(或沒有完全)在Jaybird 2.1.6中實現(我將在明天再次檢查這個),使用executeQuery()是一種可行的解決方法,因爲它只是簡單地對待任何其他生成結果集的查詢。支持getGeneratedKeys()應該在Jaybird 2.2中提供,希望在年底之前發佈。 –

+0

我檢查並使用executeQuery是Jaybird 2.1.6中唯一的方法; getGeneratedKeys在Jaybird 2.2中工作(雖然還有一些bug)。 –

-1

這將讓目前這一代

SELECT GEN_ID(GEN_NAME,0) FROM RDB$DATABASE 

與GEN_NAME被你叫那一代

當你創建一個自動增量場觸發,並造就了一代觸發看起來像這通常

SET TERM ^^ ; 
CREATE TRIGGER TABLE_BEFOREINSERT FOR TABLE ACTIVE BEFORE INSERT POSITION 0 AS 
BEGIN 

    if (new.ID is null) 
    then new.ID = gen_id(GEN_TABLE, 1); 

END ^^ 
SET TERM ; ^^ 

和產生創造看起來像這樣

​​

這兩者合在一起使得在插入一個新行之前,它檢查是否指定了ID的值,如果不是,它將增加一代並獲取其當前值並將其作爲ID列

+0

我必須使用返回嗎? 「你稱爲那一代」是什麼意思?這是一個auto_increment字段。 – TraderJoeChicago

+0

上面的代碼只是一個regualr sql語句,就像您編寫的用戶示例中的select max(id)一樣,您將從其中獲得結果,就像任何其他select語句一樣。當您將列設置爲auto_increment字段時,數據庫將創建一個通常名爲GEN_TABLE_NAME的代,其GEN_以表名前綴 – thegaffney

+0

Firebird實際上並不像其他數據庫那樣具有auto_increment字段類型,該行爲與觸發器和生成器「僞造」。在這裏查看更多信息:http://www.firebirdfaq.org/faq29/ - 我不知道JDBC驅動程序如何適應該模型。 – Harriv

2

我使用的建設得到主鍵值:

String buf =  
      "SELECT GEN_ID (<YOUR_ID_NAME*>, 0) " + //see description below 
      "FROM RDB$DATABASE"; 
try 
{ 
    Statement stm = conn.createStatement(); 
    ResultSet RS = stm.executeQuery (buf); 
    buf = null; 
    if (RS != null) 
    { 
     RS.next(); 
     buf = RS.getString (1).trim(); //That is it 
     RS.close(); 
    } 
} 
catch (SQLException e) 
{} 

現在buf將包含一個ID

< *> - 你可以幫助IBExpert看到它。在Jaybird 2.2加入

0

支持getGeneratedKeys。還有一些注意事項,默認RETURN_GENERATED_KEYS方法將返回表的所有列,所以你應該從結果按列名設置檢索列,或者使用的方法之一明確指定列索引或列名,看Jaybird (2.2.7) release notes瞭解更多詳情。

要回答你原來的問題:

  1. 當您執行INSERT ... RETURNING ...,你需要使用executeQuery(或execute),並處理結果集,如果你正在執行正常SELECT。與Jaybird 2。2,你也可以,如果你使用的是RETURN_GENERATED_KEYS使用executeUpdate並獲得getGeneratedKeys()

  2. 結果集使用INSERT ... RETURNING ...getGeneratedKeys是唯一的方式來獲得該語句生成的值,所有其他方法(如SELECT GEN_ID(GEN_NAME,0) FROM RDB$DATABASE)不能被信任因爲序列在事務控制之外,並且可能已爲不同的併發事務生成了返回值。

  3. 當你問這個問題時,它確實不被Jaybird支持(2.1.6)。

披露:我是Jaybird的開發人員之一。