Удалить ту же строку, вставленную в таблицу с помощью триггера в mysql

#mysql #sql #triggers

#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. что именно вы имеете в виду?