Триггер для пропуска определенных вставок во время LOAD DATA INFILE

Во-первых, упрощенная версия: мне интересно, могу ли я создать триггер для активации во время INSERT (на самом деле это LOAD DATA INFILE) и НЕ вводить записи для RMA уже в моей таблице?

У меня есть таблица, в которой нет уникальных записей. Некоторые из них могут быть законными дубликатами, но есть одно поле, которое я могу использовать, чтобы узнать, были ли введены данные или нет. Например

RMA     Op     Days
---------------------
213   Repair   0.10
213    Test    0.20
213   Repair   0.10

Таким образом, я мог бы сделать индекс по трем столбцам вместе, но, как вы видите, RMA может находиться в шаге в течение одного и того же времени дважды, поэтому могут быть дубликаты записей. По сути, я хочу, чтобы триггер сообщал, что если NEW.rma уже находится в таблице, перейдите к следующей строке.

Я узнал, что есть способы заставить триггер остановить вставку, поэтому я думаю, что теперь мой вопрос заключается в том, как я могу пропустить вставку и продолжить работу с остальными во время вызова LOAD DATA INFILE?


person Geoff    schedule 25.05.2010    source источник
comment
Формат не работал для моего примера. По сути, есть 3 столбца (RMA - Op - Days), показывающие, сколько дней отгруженный RMA провел на этом этапе операции.   -  person Geoff    schedule 25.05.2010


Ответы (3)


нет необходимости использовать таблицы блокировки... сделайте это так (я говорю, что имя таблицы rmainfo):

create table rmainfo_new like rmainfo;
load data infile 'filename' into table rmainfo_new;
rename table rmainfo to rmainfo_old,rmainfo_new to rmainfo;
drop table rmainfo_old;

вы также можете поместить таблицу отбрасывания в начало (сделать ее DROP TABLE IF EXISTS rmainfo_old), что оставит таблицу _old между запусками для резервного копирования/справки.

person Trey    schedule 04.01.2011

Не могли бы вы настроить составной ключ, полученный из RMA и OP? Это приведет к тому, что повторяющиеся записи будут отображаться как ошибки.

person Satanicpuppy    schedule 25.05.2010
comment
Повторяющиеся записи не являются ошибками, это моя проблема. Данные, показанные в посте, — это то, как будет выглядеть действительная запись. Чего я не хочу, так это чтобы эти три строки вводились во второй раз. У меня есть автоматический отчет с файлом Excel, который запрашивает отчеты из Oracle, а затем вставляет данные в мою базу данных. Он запускается с первого числа текущего месяца до текущей даты и запускает LOAD DATA INFILE. С другими моими отчетами это работает нормально, потому что LOAD DATA INFILE будет пропускать дубликаты, но здесь LOAD DATA INFILE не может знать, поэтому мне нужно как-то это поймать. - person Geoff; 25.05.2010
comment
Я просто всегда запускал с момента, когда я запускал последний отчет, но бывают случаи, когда я получаю сообщение об ошибке из запроса отчета Oracle, поэтому я не всегда уверен в точном времени, когда он выполнялся в последний раз, и просто проще загрузить все данные Месяц встретиться. - person Geoff; 25.05.2010

Самый простой способ, который я могу придумать, - загрузить новую таблицу, затем удалить старую и переименовать новую. LOCK TABLES должен иметь возможность изолировать этот переключатель в конце.

В качестве альтернативы, если вы уверены в порядке, в котором строки появляются в файле вставки, т. Е. Если гарантируется, что в файле есть старые строки, за которыми следуют новые строки, то вы можете сначала COUNT(*), а затем пропустить это количество строк, когда загрузка.

person Andrew Duffy    schedule 22.07.2010