Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 批量插入onDuplcateKeyIgnore JOOQ_Java_Postgresql_Jooq - Fatal编程技术网

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()
    ,而是使用
    onDuplicateKeyIgnore()
    。您在标题中提到了这一点,但在代码中没有提到。请注意,目前(从jOOQ 3.10开始),不支持
    batchAll()
    onDuplicateKeyIgnore()
    的组合,不幸的是:

您好,您是否也可以执行SQL insert语句?@JimJones,我不确定我是否正确理解了您的意思。您是否问我是否可以通过dsl.insert使用批处理来达到我的目标?我尝试了onDuplicateKeyIgnore()并收到了问题中提供的错误。所以我不知道在这种情况下如何批量生产。我尝试过dsl.loadInto(A_B_链接).batchAll().onDuplicateKeyIgnore().loadRecords(记录).fields(A_B_链接.fields()).execute();正如我所看到的,只有一个选项-添加新字段,不是吗?@Счччччччч:是的。一旦#7253被修复,我已经在考虑这个问题的未来访客中回答了这个问题