Причина, по которой вы получаете дубликаты, состоит в том, что триггер выполняет одно и то же точное выражение после каждой вставки без какой-либо ссылки на только что вставленную запись. Исходя из вашего поста, похоже, что вы хотите скопировать каждую новую запись в другую таблицу. Поэтому вы должны использовать ключевое слово «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 триггера, поэтому она действительно должна быть там? если ваша цель - скопировать каждую запись, вы можете пропустить некоторые, если их нет в справочной таблице. В конце концов, это зависит только от того, что вы пытаетесь сделать.
Сказав все это, вы уверены, что хотите использовать триггеры для этого в первую очередь? Поскольку вы используете массовые вставки, я предполагаю, что производительность важна, и наличие триггеров, запускаемых после каждой вставки, никак не повлияет на вашу производительность. Было бы лучше отключить / удалить триггер и просто иметь один оператор копирования после того, как все данные были вставлены? Это определенно было бы лучше в плане производительности.