批量插入onDuplcateKeyIgnore JOOQ

时间:2018-03-05 12:33:33

标签: java postgresql jooq

我有一个类似于

的课程
public class ABLink {
 private Long aId;
 private Long bId;
}

此类在数据库(Postgresql)中有一个对应的实体,如下所示:

CREATE TABLE a_b_link(
  a_id BIGINT NOT NULL,
  b_id BIGINT NOT NULL,
  CONSTRAINT a_b_link_pk
  PRIMARY KEY (a_id, b_id)
 );

我正试图以这样的方式使用jooq loader api执行批量插入:

 dsl.loadInto(A_B_LINK).batchAll()
                .onDuplicateKeyUpdate()
                .loadRecords(records)
                .fields(A_B_LINK.fields())
                .execute();

因为我试图为插入这样的逻辑制作批处理:

 insertInto(A_B_LINK).set(record).onDuplicateKeyUpdate().set(record).execute()

但我遇到过如下错误:

 Batch entry 0 insert into "schema"."a_b_link" ("a_id", "b_id") values (3273, 8) on conflict ("a_id", "b_id") do update set [ no fields are updated ] was aborted: ERROR: syntax error at or near "["

因为没有要更新的字段。只有这个ids。我已尝试在loader api中使用onDuplicateKeyUpdate批处理,但收到错误:

Cannot apply batch loading with onDuplicateKeyIgnore flag.

我试图在没有任何重复密钥策略的情况下执行批处理,例如:

dsl.loadInto(A_B_LINK).batchAll()
                .loadRecords(records)
                .fields(A_B_LINK.fields())
                .execute();

当然,我会不时收到违规例外情况。

我将非常感谢与此问题相关的任何帮助,建议或提示。

1 个答案:

答案 0 :(得分:0)

出现此错误的原因是,如果您的表仅包含属于主键的字段,则不会更新任何字段。

有两种方法可以“解决”这个问题:

  • 在表格中添加其他列。然后,这将是将在冲突时更新的列。
  • 请勿使用onDuplicateKeyUpdate(),而是使用onDuplicateKeyIgnore()。你在标题中提到过,但在代码中却没有。请注意,目前(从jOOQ 3.10开始),不支持batchAll()onDuplicateKeyIgnore()的组合,不幸的是:https://github.com/jOOQ/jOOQ/issues/7253