【问题标题】:Batch insert onDuplcateKeyIgnore JOOQ批量插入 onDuplcateKeyIgnore JOOQ
【发布时间】:2018-08-13 02:49:35
【问题描述】:

我有一个看起来像这样的课程

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 "["

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

Cannot apply batch loading with onDuplicateKeyIgnore flag.

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

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

当然,使用这种方法时,我会不时收到违规异常。

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

【问题讨论】:

  • 您好,您是否也可以执行 SQL 插入语句?
  • @JimJones,我不确定我是否理解正确。你问我是否可以通过 dsl.insert 达到我的目标?

标签: java postgresql jooq


【解决方案1】:

出现此错误的原因是,如果您的表仅包含属于主键的字段,则没有剩余字段可供更新。

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

  • 向表中添加一个附加列。然后,这将是冲突时更新的列。
  • 不要使用onDuplicateKeyUpdate(),而是使用onDuplicateKeyIgnore()。您在标题中提到了这一点,但在代码中没有提到。请注意,目前(截至 jOOQ 3.10),不支持 batchAll()onDuplicateKeyIgnore() 的组合,不幸的是:https://github.com/jOOQ/jOOQ/issues/7253

【讨论】:

  • 我试过 onDuplicateKeyIgnore() 并收到问题中提供的错误。所以我不明白在这种情况下如何制作批处理。我试过 dsl.loadInto(A_B_LINK).batchAll() .onDuplicateKeyIgnore() .loadRecords(records) .fields(A_B_LINK.fields()) .execute();如我所见,只有 1 个选项 - 添加新字段,不是吗?
  • @ВикторияХлыстун:是的。一旦 #7253 得到修复,我已经在考虑这个问题的未来访问者的情况下回答了这个问题
猜你喜欢
  • 2021-03-27
  • 2020-05-22
  • 2017-12-29
  • 2021-05-23
  • 2020-03-18
  • 2021-01-20
  • 2013-07-02
  • 2021-09-08
  • 2023-01-14
相关资源
最近更新 更多