Способ сделать пакетное обновление и вставить - PullRequest
1 голос
/ 11 марта 2011

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

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

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

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

1 Ответ

1 голос
/ 12 марта 2011

Сохранить записи из веб-службы в текстовом файле.Затем выполните пакетную вставку в пустую временную таблицу.Код будет варьироваться в зависимости от 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, я могу изменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...