gpt4 book ai didi

java - 批量插入onDuplcateKey忽略JOOQ

转载 作者:行者123 更新时间:2023-11-29 13:45:27 25 4
gpt4 key购买 nike

我有一个类看起来像

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。我尝试在加载器 api 中使用 onDuplicateKeyUpdate 进行批处理,但我收到一个错误:

Cannot apply batch loading with onDuplicateKeyIgnore flag.

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

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

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

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

最佳答案

此错误的原因是如果您的表仅包含属于主键一部分的字段,则没有要更新的字段。

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

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

关于java - 批量插入onDuplcateKey忽略JOOQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49110621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com