2016-09-30 45 views
1

我正在使用postgres數據庫和Java。我正在使用Jooq來查詢我的數據庫。 我需要在我的表中創建一個插入,並獲取該插入生成的primary_key/sequence。我知道簡單的Postgres的我能做到這一點是這樣的:在jooq中使用postgres currval()

這是我的表是什麼樣子:

CREATE TABLE "myTable" (

    "id" SERIAL NOT NULL, 
    "some_text" TEXT NOT NULL, 
    PRIMARY KEY ("id") 
); 

這是插入查詢:

INSERT INTO public.myTable(some_text) 

VALUES ('myValue'); 

,比以獲得最新的序列,

SELECT currval('myTableName_myColumnName_seq') 

FROM myTable; 

1)如何在JOOQ中使用currval? 現在我試圖這樣的事情:

config.dsl().insertInto(Tables.myTable) 
       .set(Tables.myTable.myText, inputText) 
       .execute(); 

config.dsl().select.currval('myTableName_myColumnName_seq') 
       .from myTable; 

但場外的最後一條語句給出錯誤。

回答

2

解決方案的問題在於,當您向表中插入記錄時,可能會有另一個流程從序列中獲取值,並且您的第二個查詢(SELECT currval)會得到錯誤的值。

PostgreSQL允許您使用RETURNING條款得到一些數據傳回在INSERT聲明:

INSERT INTO public.myTable(some_text) 
VALUES ('myValue') 
RETURNING id; 

由於jOOQ手動狀態,你應該在這種情況下使用returningfetch。我不知道如何正確使用(我不熟悉的jOOQ),類似以下內容:

config.dsl().insertInto(Tables.myTable) 
      .set(Tables.myTable.myText, inputText) 
      .returning(Tables.myTable.id) 
      .fetch(); 
2

你可以得到一個序列通過Sequence.currval()當前值,它返回一個表達式用於這一目的。例如。

dsl().select(MYTABLENAME_MYCOLUMNNAME_SEQ.currval()).from(...) 

但因爲這個序列是自動生成從SERIAL這對你插入自動生成的序列值,我完全同意icuken's answer,你應該使用INSERT .. RETURNING代替。

+0

所以我用上面的查詢icuken並將結果存儲在Result對象中。雖然我只給出了「返回」函數中的一個列名,但是我得到了其他列值標記爲空的整個表。我現在想從這個結果表中提取這個id。我怎樣才能做到這一點? id是JOOQ生成的類中的Integer類型。它是數據庫中的一個串行主鍵。 – user1858796

+0

@ user1858796:只需使用'result.getValue(index,column)'。有很多方法,這是其中之一。希望這可以幫助。 –