Возможно ли это?
Не уверен, почему вы думаете, что это невозможно.Какие-то конкретные причины?
Я отвечаю, поскольку вы пометили его как jdbc , что означает, что вы ищете решение, не зависящее от БД, и исключительно на Java.
Слияние означает - обновить строку, если строка уже существует в целевой базе данных, в противном случае вставить новую строку в целевую базу данных (критерии поиска являются первичным ключом).
Поэтому запустите выборисходная база данных, итерация по ней и в цикле итерации
- запустить выборку целевой базы данных для столбцов первичного ключа в
WHERE
предложении Если результат найден вtarget db - создать UPDATE
PreparedStatement
, установить значения в подготовленном операторе обновления из исходных данных и добавить в пакет (т.е. не выполнять его)
, если строка не найденана шаге 2 создайте INSERT
PreparedStatement
, установите значения в подготовленном операторе из исходных данных и добавьте в пакет
- Если порог партии достигнут, выполните партии, подготовленные на шагах 2 и 3.
- Перейти к шагу # 1.
В качестве альтернативы, вы можете попробовать вставить отдельные строки, и если выдается нарушение ограничения, попробуйте обновить эту строку в блоке catch.При таком подходе операторы insert & batch не могут выполняться пакетами, как указано выше.
Третий подход заключается в прямом использовании оператора MERGE (если целевая БД поддерживает его), как показано здесь , посмотрите на метод - public static void MergeTables(Connection conn)
.MERGE может быть выполнен с помощью операторов jdbc, метод executeUpdate
.
Обратите внимание, что проблема, связанная с вышеуказанными шагами, связана только с производительностью при выполнении шага № 1 в цикле - может быть слишком много вызовов БД для большого объема данных.Так что этот вид работы обычно выполняется в специализированных инструментах ETL (Informatica и т. Д.) Или PL / SQL.