У меня есть 2 таблицы: comments
и comments_likes
.
комментарии
id
message
likes
Триггеры
ПОСЛЕ УДАЛЕНИЯ
DELETE FROM comments_likes WHERE comment_id = OLD.id;
comments_likes
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**
Итак, вопрос: можно отключить триггеры при активации их из другого триггера?
Я хочу, чтобы что-то понравилось:
ПОСЛЕ УДАЛЕНИЯ
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
UPDATE LOW PRIORITY
и IGNORE
не работают.
[ИЗМЕНИТЬ 2]
У меня есть другая идея, можно установить глобальную переменную в первом триггере и прочитать ее с другого триггера?
Пример:
первый триггер:
@disable_triggers = true;
// do the stuff that calls another triggers
@disable_triggers = false;
другой триггер:
if @disable_triggers = false then
// do the stuff
end if;