我正在try 将从一个数据库的一个表检索到的行插入到另一个数据库的相同表中.这两个数据库都是PostgreSQL.

我只想检索表中所有行的整列作为记录,并简单地将其插入到另一个数据库中的表中.

我编写了以下代码:

try {
            String sourceDbUrl = "jdbc:postgresql://localhost:5432/sourcedb";
            String sourceDbUsername = "postgres";
            String sourceDbPassword = "admin";
            Connection sourceConnection = DriverManager.getConnection(sourceDbUrl, sourceDbUsername, sourceDbPassword);
            Configuration sourceConfig = new DefaultConfiguration().set(sourceConnection).set(SQLDialect.POSTGRES);


            String targetDbUrl = "jdbc:postgresql://localhost:5432/targetdb";
            String targetDbUsername = "postgres";
            String targetDbPassword = "admin";
            Connection targetConnection = DriverManager.getConnection(targetDbUrl, targetDbUsername, targetDbPassword);
            Configuration targetConfig = new DefaultConfiguration().set(targetConnection).set(SQLDialect.POSTGRES);

            String sourceSchema = "public";
            String targetSchema = "public";

            Table<Record> sourceTable = DSL.table(DSL.name(sourceSchema, "mytable"));
            Table<Record> targetTable = DSL.table(DSL.name(targetSchema, "mytable"));
            DSLContext sourceDslContext = DSL.using(sourceConfig);
            DSLContext targetDslContext = DSL.using(targetConfig);
            String customSelectQuery = "SELECT * FROM " + sourceSchema + ".mytable";

            Result<Record> records = sourceDslContext.fetch(customSelectQuery);
            
            for (Record record : records)
                targetDslContext
                        .insertInto(targetTable)
                        .set(record)
                        .onDuplicateKeyUpdate()
                        .set(record)
                        .execute();


        } catch (Exception e) {
            e.printStackTrace();
        }

我可以看到我成功地检索到了记录.

然而,不知何故,在由jooq inside for循环创建的upsert查询中,记录值被发送为空,我得到了以下异常:

数据访问异常:SQL[INSERT INTO"PUBLIC"."MyTABLE"VALUES()ON冲突([UNKNOWN PRIMARY KEY])DO UPDATE SET[未更新任何字段]];ERROR:语法错误在或附近")" 职位:40 在org.jooq_3.16.1.POSTGRES.DEBUG(未知源) 在org.jooq.impl.Tools.translate(Tools.java:3089) 在org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:670) 在org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:349) 在org.jooq.impl.AbstractDelegatingQuery.execute(AbstractDelegatingQuery.java:115) 在Main.Main(Main.Java:48) 由:org.postgresql.util.PSQLException:Error:语法错误位于或附近")" 职位:40 在org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2552) 在org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2284) 在org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:322) 在org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481) 在org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401) 在org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164) 在org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:153) 在org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:219) 在org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:414) 在org.jooq.impl.AbstractDMLQuery.execute(AbstractDMLQuery.java:961) 在org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:335) ...再来两个

我感谢您的 comments .

谢谢,

推荐答案

这篇关于why you should use jOOQ with code generation的文章解释了为什么你会遇到这个问题.简而言之,如果您的表没有附加主键/唯一键元数据,jOOQ就不能在您的PostgreSQL方言上模拟MySQL ON DUPLICATE KEY UPDATE子句.

但话又说回来,为什么要用那个呢?您使用的是PostgreSQL,而jOOQ对PostgreSQL的ON CONFLICT子句有本机支持(对于更复杂的情况,jOOQ也支持MERGE),所以请改用本机语法.

Java相关问答推荐

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

将偶数元素移动到数组的前面,同时保持相对顺序

Mat. n_Delete()和Mat. n_release的区别

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

多个Java线程和TreeMap.put()的非预期行为

';com.itextpdf.ext.html.WebColors已弃用

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

使用Spring Boot3.2和虚拟线程的并行服务调用

为什么Java Annotation接口覆盖对象类中的方法

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

第三方Jar pom.xml

用OSQL创建索引

如何在JavaFX中处理多个按钮

如何在一行中使用Dijkstra中的Java Stream

如何使用路径过渡方法使 node 绕圆旋转?

是否有一个Java Future实现可以在池繁忙时在调用者线程中执行?

在应用getCellFormula()时,Excel引用中的文件名始终为";[1]";使用Apache POI()

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

javax.crypto-密码对象-提供者服务是如何工作的?

将天数添加到ZonedDateTime不会更改时间