Java 批量插入onDuplcateKeyIgnore JOOQ
我有一门课看起来像Java 批量插入onDuplcateKeyIgnore JOOQ,java,postgresql,jooq,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) ); 我正试图以这样的方式使用joo
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()
。您在标题中提到了这一点,但在代码中没有提到。请注意,目前(从jOOQ 3.10开始),不支持onDuplicateKeyIgnore()
和batchAll()
的组合,不幸的是:onDuplicateKeyIgnore()