2016-09-30 68 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)'。有很多方法,这是其中之一。希望这可以帮助。 –