我正在使用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;
但是当然,最后一个语句会出错。
答案 0 :(得分:2)
您的解决方案的问题在于,当您向表中插入记录时,可能会有另一个进程从序列中获取值,并且您的第二个查询会得到错误的值(SELECT currval
)
PostgreSQL允许您使用INSERT
子句在RETURNING
语句中获取一些数据:
INSERT INTO public.myTable(some_text)
VALUES ('myValue')
RETURNING id;
正如jOOQ手册所述,在这种情况下,您应该使用returning
和fetch
。我不确定正确使用(我不熟悉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
代替。