У меня есть 2 таблицы: комментарии
и комментарии_лайки
.
комментарии
id
message
likes
триггеры :
ПОСЛЕ УДАЛЕНИЯ
DELETE FROM comments_likes WHERE comment_id = OLD.id;
комментарии_ликов
id
comment_id
триггеры :
ПОСЛЕ ВСТАВКИ
UPDATE comments SET likes = likes + 1 WHERE comments.id = NEW.comment_id;
ПОСЛЕ УДАЛЕНИЯ
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
ПОСЛЕ ОБНОВЛЕНИЯ
**omited code, updates comments**
Итак, вопрос то есть, могу ли я отключить триггеры при их активации из другого триггера ?
Я хочу сделать что-нибудь вроде этого:
ПОСЛЕ УДАЛЕНИЯ
{{ 1}}IF NOT called_from_another_trigger() THEN
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
END IF;
[EDIT]
Неоптимизированное решение (очень медленный запрос ... выполняет запрос для каждого регистра LIKE):
BEGIN
IF (SELECT id FROM comments WHERE comments.id = OLD.comment_id) THEN
UPDATE comments SET comments.cache_likes = comments.cache_likes - 1 WHERE comments.id = OLD.comment_id;
END IF;
END
ОБНОВЛЕНИЕ НИЗКИЙ ПРИОРИТЕТ
и ИГНОРИРОВАНИЕ
не работают.
[РЕДАКТИРОВАТЬ 2]
У меня есть другая идея, можно ли установить глобальную переменную в первом триггере и прочитать ее из другого триггера?
Пример:
первый триггер:
@disable_triggers = true;
// do the stuff that calls another triggers
@disable_triggers = false;
другой триггер:
if @disable_triggers = false then
// do the stuff
end if;
Чтобы отключить триггеры, вы можете сделать:
Триггер 1
SET @disable_trigger = 1;
// do stuff that calls trigger 2
SET @disable_trigger = NULL;
Триггер 2
IF @disable_trigger IS NULL THEN
// do stuff only if called from a query and not from trigger 1
END IF;
Нет, нельзя. В этом и смысл триггеров: запускаться всегда.
Кроме того, я не понимаю, зачем вам это нужно в вашем случае. В худшем случае ничего не обновляется — никаких ошибок не будет.
Вы всегда можете добавить условие в свой триггер, чтобы проверить, должны ли они (или часть их кода) запускаться (например, есть ли запись в соответствующей таблице).