在jooq中使用postgres currval()

时间:2016-09-30 07:54:56

标签: postgresql jooq

我正在使用postgres数据库和Java。我正在使用Jooq来查询我的数据库。  我需要在我的表中插入并获取该插入生成的primary_key /序列。我知道在简单的postgres中,我可以这样做:

这就是我的表格:

(df.start =< key_df.start) && (df.end => key_df.end)

这是插入查询:

CREATE TABLE "myTable" (

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

而不是获得最新的序列,

INSERT INTO public.myTable(some_text)

VALUES ('myValue');

1)如何在JOOQ中使用currval? 现在我正在尝试这样的事情:

SELECT currval('myTableName_myColumnName_seq')

FROM myTable;

但是当然,最后一个语句会出错。

2 个答案:

答案 0 :(得分:2)

您的解决方案的问题在于,当您向表中插入记录时,可能会有另一个进程从序列中获取值,并且您的第二个查询会得到错误的值(SELECT currval

PostgreSQL允许您使用INSERT子句在RETURNING语句中获取一些数据:

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

答案 1 :(得分:2)

您可以通过Sequence.currval()获取序列的当前值,该值返回用于该目的的表达式。 E.g。

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

但是,由于此序列是从SERIAL自动生成的,会自动生成插入的序列值,我完全赞同icuken's answer,您应该使用INSERT .. RETURNING代替。