#mysql
#mysql #sql #триггеры
Вопрос:
Я пытаюсь удалить строку после вставки во временную таблицу и получаю эту ошибку:
INSERT INTO `temp_program_counter` (`id`, `program_id`) values (NULL, '275')
Не удается обновить таблицу ‘temp_program_counter’ в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию / триггер.
И вот мой триггер:
DELIMITER $$
DROP TRIGGER IF EXISTS `testtemp`$$
CREATE
TRIGGER `testtemp` AFTER INSERT ON `temp_program_counter`
FOR EACH ROW BEGIN
UPDATE `program` SET `view_count`=`view_count` 1;
DELETE FROM `temp_program_counter` WHERE id=new.id;
END;
$$
DELIMITER ;
эта таблица является временной таблицей, которая получает данные с задержкой и после получения должна обновить основную таблицу и быть удалена из temp.
заранее спасибо за помощь.
Ответ №1:
Вероятно, вы уже каким-то образом решили эту проблему, но я все равно опубликую ответ:
Вы не можете ссылаться на ту же таблицу, которая вызвала триггер в триггере (или комбинацию триггера и хранимой процедуры). Это может означать бесконечный цикл, поэтому sql предотвращает это, выдавая эту ошибку, что приводит к всегда одной и той же ошибке.
Комментарии:
1. Полезно знать — я думал, что это связано с транзакцией, но это не имело смысла, поскольку триггер находится в той же транзакции — это имеет гораздо больше смысла.
Ответ №2:
Попробуйте ПЕРЕД ВСТАВКОЙ, потому что вы пытаетесь удалить запись, которая только что была вставлена, но, возможно, еще не зафиксирована в этом сеансе. Следовательно, вы получаете ошибку.
Если вы используете ПЕРЕД ВСТАВКОЙ, то все остальные записи в таблице с id=new.id будет удален, и новая запись будет успешно вставлена.
DELIMITER $$
DROP TRIGGER IF EXISTS `testtemp`$$
CREATE
TRIGGER `testtemp` BEFORE INSERT ON `temp_program_counter`
FOR EACH ROW BEGIN
UPDATE `program` SET `view_count`=`view_count` 1;
DELETE FROM `temp_program_counter` WHERE id=new.id;
END;
$$
DELIMITER ;
Комментарии:
1. Может быть, попробовать зафиксировать после инструкции delete?
2. что именно вы имеете в виду?