【问题标题】:How to batch insert using jooq without fetching sequence number如何使用jooq批量插入而不获取序列号
【发布时间】:2021-01-05 08:22:03
【问题描述】:

我想使用 jooq 批量插入到 postgres:

List<MyTableRecord> records = new ArrayList<>();
for (Dto dto : dtos) {
    Field<Long> sequenceId = SEQUENCE.nextval();
    Long id = using(ctx).select(sequenceId).fetchOne(sequenceId);
    records.add(mapToRecord(dto, id));
}
using(ctx).batchInsert(records).execute();

问题是我正在为每一行获取下一个序列号。

对于简单的插入,我可以在这样的语句中使用字段:

create.insertInto(ID, VALUE)
  .values(SEQUENCE.nextval(), val("William"))
  .execute();

如何使用批量插入来做到这一点?

【问题讨论】:

    标签: java database code-generation jooq


    【解决方案1】:

    预取所有序列值

    您可以使用以下方法预取所有需要的序列值:

    List<Long> ids = using(ctx)
        .select(sequenceId)
        .from(generateSeries(1, dtos.size()))
        .fetch(sequenceId);
    
    for (int i = 0; i < dtos.size(); i++)
        records.add(mapToRecord(dtos.get(i), ids.get(i)));
    
    using(ctx).batchInsert(records).execute();
    

    这似乎是一个开箱即用的有用功能,通过 using(ctx).nextvals(SEQUENCE, dtos.size()) 以与 RDBMS 无关的方式。我们将在未来的 jOOQ 版本中考虑这一点:https://github.com/jOOQ/jOOQ/issues/10658

    不要使用记录

    另一种方法是批处理实际的INSERT 语句,而不是通过batchInsert() 调用Record.insert()。这样,您可以将SEQUENCE.nextval() 表达式放入语句中。见:https://www.jooq.org/doc/latest/manual/sql-execution/batch-execution/

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 2018-08-13
      • 2021-03-27
      • 2020-05-22
      • 2017-12-29
      • 2014-10-06
      • 2022-11-11
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多