gpt4 book ai didi

Java jdbc 批量仅插入新行

转载 作者:行者123 更新时间:2023-11-30 05:49:18 25 4
gpt4 key购买 nike

如何使用 jdbc 仅针对新行(目标表中不存在 ID 列值)高效地执行向 Sql Server 表的批量插入?

实际上我正在使用PreparedStatement对象来创建批处理,但没有“仅在新行时插入”逻辑:

String sqlInsertStub = "INSERT INTO mytable (id, col2, col3) values (?, ?, ?)";

try (PreparedStatement preparedStatement = connection.prepareStatement(sqlInsertStub)) {

connection.setAutoCommit(false);

int processed = 0;

while (resultSet.next()) {

// [...]

preparedStatement.setInt(1, id);
preparedStatement.setString(2, col2);
preparedStatement.setString(3, col3);

preparedStatement.addBatch();

if (++processed % BATCH_SIZE == 0) {
preparedStatement.executeBatch();
connection.commit();
}

}

preparedStatement.executeBatch();
connection.commit();


catch (Exception e) {

connection.rollBack();
e.printStackTrace();
System.exit(1);

}

最佳答案

一种选择是在表中的三列上添加唯一约束,以确定唯一性。然后,尝试插入重复记录应该会导致 Java 异常。但是,这可能会导致整个批处理失败。如果您想要其他选项,可以将查询更改为以下内容:

INSERT INTO mytable
SELECT ?, ?, ?
WHERE NOT EXISTS (SELECT 1 FROM mytable
WHERE id = ? AND col2 = ? AND col3 = ?);

对于此查询,您将值绑定(bind)两次,如下所示:

preparedStatement.setInt(1, id);
preparedStatement.setString(2, col2);
preparedStatement.setString(3, col3);
preparedStatement.setInt(4, id);
preparedStatement.setString(5, col2);
preparedStatement.setString(6, col3);

关于Java jdbc 批量仅插入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54234914/

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