【问题标题】:Using postgres currval() in jooq在 jooq 中使用 postgres currval()
【发布时间】:2017-02-08 17:31:34
【问题描述】:

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

这是我的桌子的样子:

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;

但是最后一条语句会出错。

【问题讨论】:

    标签: postgresql jooq


    【解决方案1】:

    您的解决方案的问题在于,当您向表中插入记录时,可能会有另一个进程从序列中获取值,而您的第二个查询将得到错误的值 (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

      【讨论】:

      • 所以我使用 icuken 的上述查询并将结果存储在 Result 对象中。虽然我在“返回”函数中只给出了一个列名,但我得到了整个表,其他列的值标记为空。我现在只想从此结果表中提取 id。我怎样才能做到这一点? id 是 JOOQ 生成的类中的 Integer 类型。它是数据库中的串行主键。
      • @user1858796:只需使用result.getValue(index, column)。方法有很多,这是其中之一。希望这会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2014-08-12
      • 2017-01-08
      • 2021-08-28
      • 2017-01-24
      • 2019-07-09
      • 2014-09-23
      相关资源
      最近更新 更多