Пакетная вставка в базу данных с пропуском дубликатов, найденных в базе данных - PullRequest
0 голосов
/ 06 марта 2020

Я бы хотел сохранить в базе данных список объектов, используя Spring. В моем контроллере я получаю список строк, скажем, это города. Я отфильтровываю дубликаты и получаю уникальные Set города. Как вставить этот набор базы данных, когда у меня есть уникальное ограничение на столбец города? Здесь я вижу три варианта:

  1. Перед любой вставкой я проверяю, существует ли уже такая запись, если ее нет, я сохраняю объект домена.

  2. Я пытаюсь сохранить объект домена объекта, не проверяя, существует ли он в базе данных или нет. Когда я сталкиваюсь с SQL Exception, я пытаюсь сохранить другой объект домена.

  3. Я извлекаю все объекты из базы данных (список записей может определенно превышать 100 тысяч), затем я создаю набор уникальных (отсутствующих в базе данных) объектов домена и затем сохранить их в базе данных.

Какой вариант будет go? Есть (надеюсь) лучший вариант?

1 Ответ

0 голосов
/ 06 марта 2020

Вы можете создать глобальную временную таблицу , принадлежащую пользователю oracle, которая выполняет вставки с той же структурой, что и таблица назначения. Следующий псевдокод должен дать вам представление. Наименьшая суета - создать его с помощью ON COMMIT DELETE ROWS, но иногда проще использовать ON COMMIT PRESERVE ROWS и начинать каждый сеанс с

DELETE FROM <your global temporary table>;

Затем вставьте все данные из Spring в эту таблицу. Я предполагаю, что в таблице назначения нет повторяющихся идентификаторов или дублирующих городов с одинаковым идентификатором.

INSERT INTO <your destination table> SELECT city_id, city_name, third_field
FROM <your global temporary table> 
WHERE <your global temporary table>.city_name
NOT IN (SELECT <your destination table>.city_name
FROM <your destination table>);

Если у вас есть дублированные названия городов с другим идентификатором, вы можете просто добавить еще одно предложение NOT IN.

...