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