Способ выполнения пакетного обновления и вставки

Я ищу несколько советов и вещей для рассмотрения этой проблемы. Я получаю тысячи записей из вызова веб-сервисов. Соответствующими элементами данных являются id, startDate, termDate, имя и некоторые другие поля. Существует db, заполненный некоторыми записями. Единственность – id + startDate + termDate, обратите внимание, что может быть много одинаковых идентификаторов с разными начальными датами и / или termDate.

Для записей из вызова веб-служб мне нужно найти записи, которые соответствуют уникальному ограничению, и для этих записей сделать обновление. Для записей из веб-служб, которые НЕ находятся в db (id + startDate + termDate), мне нужно вставить запись.

В настоящее время приложение использует iBatis. Мне нужно какое-то направление, чтобы сделать «существующую запись» существующей рутиной и как отслеживать записи веб-сервисов, которые необходимо использовать для обновления по сравнению с вставкой.

Затем, как только у меня появятся эти два набора ректорнов, мне интересно, что лучше всего сделать для работы db. Лучше всего перебирать один раз за один раз и выполнять работу (вставлять или обновлять), или лучше подумать о том, чтобы сделать одно большое обновление или вставить строку, в которой есть все записи, поэтому в действительности я бы есть два вызова db, один для обновления и один для вставки (но sql будет огромным)?

    Сохраните записи из веб-службы в текстовом файле. Затем вставьте пакетную вставку в пустую временную таблицу. Код будет меняться в соответствии с rdbms.

    Как только у вас есть временная таблица, вставьте:

    insert into my_table (id, startDate, termDate, name) select t.id, t.startDate, t.termDate, t.name from temp_table t left outer join my_table my on t.id = my.id and t.startDate = my.startDate and t.termDate = my.termDate where my.id is null 

    И обновление:

     update my_table set id = t.id, startDate = t.startDate, termDate = t.termDate, name = t.name from temp_table t inner join my_table my on t.id = my.id and t.startDate = my.startDate and t.termDate = my.termDate where id = t.id and startDate = t.startDate and termDate = t.termDate 

    Синтаксис не проверенного обновления выше должен работать в postgresql. Если вы укажете rdbms, я могу его изменить.