java - jOOQ 幂等批量插入

标签 java sql jooq

我正在尝试实现一个幂等插入,这个查询看起来很适合这个任务

insert into test_table
select *
from (
         values (1, 2, 3, 4),
                (3, 4, 5, 6),
                (1, 2, 3, 4),
                (3, 4, 5, 6)
     ) as data(a, b, c, d)
where not exists(select 1
                 from test_table
                 where test_table.a = data.a
                   and test_table.b = data.b
                   and test_table.c = data.c);

请帮助将此查询转换为 jOOQ DSL
我使用了 Greenplum 数据库并且不支持 ON CONFLICT 语法

最佳答案

ctx.insertInto(TEST_TABLE)
   .select(
       select()
       .from(values(
           row(1, 2, 3, 4),
           row(3, 4, 5, 6),
           row(1, 2, 3, 4),
           row(3, 4, 5, 6)
       ).as("data", "a", "b", "c", "d"))
       .whereNotExists(
           selectOne()
           .from(TEST_TABLE)
           .where(TEST_TABLE.A.eq(field(name("data", "a"), TEST_TABLE.A.getDataType())))
           .and(TEST_TABLE.B.eq(field(name("data", "b"), TEST_TABLE.A.getDataType())))
           .and(TEST_TABLE.C.eq(field(name("data", "c"), TEST_TABLE.A.getDataType())))
       )
   )
   .execute();

此答案假设您正在为 TEST_DATA 使用代码生成器(否则,请手动构建您的标识符,如上所示的 name("data", "a")or as shown here)。此外,它假设:

import static org.jooq.impl.DSL.*;

When Greenplum is formally supported, see #4700 ,然后可以为您模拟 ON CONFLICTON DUPLICATE KEY IGNORE

关于java - jOOQ 幂等批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65323651/

相关文章:

java - 使用多维表中的项目填充 JComboBox

java - 在hibernate spring jsf和primefaces的集成中将primefaces数据表编辑到数据库后保存数据

sql查询用特定单词分割一行

php - 您如何管理 SQL 查询

mysql - 带数量单位转换的group-by查询sql怎么写?

java - 如果类 X 中的静态初始化程序调用 Y 中的方法,但 Y 的静态初始化程序调用 X 中的方法来设置其静态值,该怎么办?

sqlite - 无法使用JOOQ更新SQLITE中的表行

java - 为具有不同模式的多个数据库生成 jOOQ 代码

java - 模式更新后 jOOQ 生成类的运行时验证?

java - 如何使用dropwizard实现put操作