Как запустить триггер MYSQL после полной массовой вставки? - PullRequest
0 голосов
/ 05 июня 2019

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

Но срабатывает каждая строка, вставленная в таблицу. Так что я получаю дублированные значения. Посоветуйте, пожалуйста, как предотвратить срабатывание триггера в каждой строке или любую другую альтернативу для обработки сценария использования.

 CREATE DEFINER=`root`@`localhost` TRIGGER `cost_AFTER_INSERT` AFTER INSERT ON `cost` FOR EACH ROW BEGIN
INSERT INTO `finance`.`finance_master`
(`Source`,
`January`,
`February`,
`March`,
`April`,
`May`,
`June`,
`July`,
`August`,
`September`,
`October`,
`November`,
`December`) 
select ref.name,ref.owner,ref.department_id,c.source
c.Jan,
c.Feb,
c.Mar,
c.Apr,
c.May,
c.Jun,
c.Jul,
c.Aug,
c.Sep,
c.Oct,
c.Nov,
c.Dec 
from cost as c ,reference as ref where c.name = ref.name;

END

1 Ответ

2 голосов
/ 05 июня 2019

Причина, по которой вы получаете дубликаты, состоит в том, что триггер выполняет одно и то же точное выражение после каждой вставки без какой-либо ссылки на только что вставленную запись. Исходя из вашего поста, похоже, что вы хотите скопировать каждую новую запись в другую таблицу. Поэтому вы должны использовать ключевое слово «new» для ссылки на запись, которую вы пытаетесь вставить. Что-то вроде:

 CREATE DEFINER=`root`@`localhost` TRIGGER `cost_AFTER_INSERT` AFTER INSERT ON `cost` FOR EACH ROW BEGIN
INSERT INTO `finance`.`finance_master`
(`Source`,
`January`,
`February`,
`March`,
`April`,
`May`,
`June`,
`July`,
`August`,
`September`,
`October`,
`November`,
`December`) 
select new.source
new.Jan,
new.Feb,
new.Mar,
new.Apr,
new.May,
new.Jun,
new.Jul,
new.Aug,
new.Sep,
new.Oct,
new.Nov,
new.Dec 
from reference as ref where new.name = ref.name;

END

Кроме того, я заметил, что таблица 'reference' не является частью предложения select триггера, поэтому она действительно должна быть там? если ваша цель - скопировать каждую запись, вы можете пропустить некоторые, если их нет в справочной таблице. В конце концов, это зависит только от того, что вы пытаетесь сделать.

Сказав все это, вы уверены, что хотите использовать триггеры для этого в первую очередь? Поскольку вы используете массовые вставки, я предполагаю, что производительность важна, и наличие триггеров, запускаемых после каждой вставки, никак не повлияет на вашу производительность. Было бы лучше отключить / удалить триггер и просто иметь один оператор копирования после того, как все данные были вставлены? Это определенно было бы лучше в плане производительности.

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