Сделайте запрос в mysql без вызова триггера (Как отключить триггер)

у меня есть 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

обновление LOW PRIORITY и IGNORE не работает.

[EDIT 2]

у меня есть другая идея, Можно ли установить глобальную переменную в первом триггере и прочитать ее с другого триггера?

Ex:

первый триггер:

@disable_triggers = true;
// do the stuff that calls another triggers
@disable_triggers = false;

другое триггер:

if @disable_triggers = false then
    // do the stuff
end if;

3 ответов


чтобы отключить триггеры, вы можете сделать:

триггер 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;

может быть немного уродливым, но то, что я делаю, это переименовать таблицу в table2, которую триггер тоже не прикрепляет, а затем, в конце, переименовать обратно.


нет, вы не можете. В этом суть триггеров: их нужно запускать всегда.

вы всегда можете добавить условие в свой триггер, чтобы проверить, должны ли они (или часть их кода) выполняться (например, если есть запись в соответствующей таблице).