Необходимо избегать всех записей, имеющих более одного вхождения, используя контрольный файл загрузчика SQL - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу избежать вставки всех записей в таблицу с помощью SQL Loader. Таблица, в которую мы вставляем, имеет первичный ключ над 3 столбцами. Всякий раз, когда происходит дублирование, код завершается с нарушением первичного ключа.

У меня есть требование пропустить / избежать всех записей, имеющих более одного вхождения в файле данных, при вставке с использованием контрольного файла. Может ли кто-нибудь помочь мне здесь?

Есть ли способ пропустить эти записи, добавив некоторые условия в сам контрольный файл?

1 Ответ

1 голос
/ 18 апреля 2020

Мне кажется, что вы ищете проблему, в то время как проблемы вообще нет.

  • есть таблица
  • , в ней установлено ограничение первичного ключа
  • есть файл с данными, некоторые из них являются дубликатами (по смыслу столбцов первичного ключа)
  • начинается сеанс загрузки
  • строк, которые удовлетворяют всем условиям, успешно загружаются в таблица
  • строки, которые нарушают что-либо (включая ограничение первичного ключа) не загружаются
    • оно (ошибка) записывается в файл .log
    • эти строки теперь находятся в .bad файле
  • после завершения загрузки, таблица содержит только отдельные строки

На всякий случай, если вы этого не сделали знаете, есть параметр errors; его значение является целым числом, и оно показывает, сколько ошибок вы хотите разрешить:

  • по умолчанию 50
  • , если вы не хотите разрешать какие-либо ошибки, установите его на 0
  • если вы хотите разрешить любое количество ошибок, установите для него очень высокое значение

Итак, в чем проблема? Я не вижу никаких.


Как кажется, - в случае дубликатов - вы не хотите загружать любые из этих строк, поскольку вы не знаете, какие один правильный, я не думаю, что SQL Loader способен на это.

Один вариант - переключиться на внешнюю таблицу , которая имеет входной файл в качестве источника и действует как «обычная» таблица и позволяет вам писать SELECT операторов напрямую, без предварительной загрузки данных в базу данных. Это позволяет вам пропустить дубликаты, например,

insert into target_table (col1, col2, ...)
  select col1, col2, ...
  from external_table a
  where (a.pkcol1, a.pkcol2, pkcol3) not in 
        (select b.pkcol1, b.pkcol2, b.pkcol3
         from external_table b
         group by b.pkcol1, b.pkcol2, b.pkcol3
         having count(*) > 1
        );

Или вы можете отключить ограничение первичного ключа , загрузить данные, как вы это делаете сейчас (включая дубликаты), а затем удалить все дубликаты, например,

delete from target_table a
      where (a.pkcol1, a.pkcol2, pkcol3) in 
            (select b.pkcol1, b.pkcol2, b.pkcol3
             from target_table b
             group by b.pkcol1, b.pkcol2, b.pkcol3
             having count(*) > 1
            );

Затем повторно включите ограничение первичного ключа.

...