Java JDBC пакетной вставки только новые строки - PullRequest
0 голосов
/ 17 января 2019

Как эффективно выполнить пакетную вставку в таблицу сервера Sql, используя jdbc только для новых строк (значение столбца идентификатора отсутствует в целевой таблице)?

На самом деле я использую объект 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);

}

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Я также нашел другое возможное решение с помощью слияния:

String sqlInsertStub = "MERGE INTO mytable a USING (SELECT ? ID) b " +
                        "ON (a.ID = b.ID)" +
                        "WHEN NOT MATCHED " +
                        "THEN INSERT (ID, COL1, COL2) VALUES(b.ID, ?, ?)";
0 голосов
/ 17 января 2019

Один из вариантов - добавить уникальное ограничение на три столбца в вашей таблице, которые определяют уникальность. Затем попытка вставить повторяющуюся запись должна привести к исключению Java. Но это может привести к сбою всей партии. Если вы хотите другой вариант, вы можете изменить свой запрос следующим образом:

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

С этим запросом вы связываете значения дважды следующим образом:

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