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

У меня есть 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;
14
задан Wiliam 26 August 2010 в 19:07
поделиться

2 ответа

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

Триггер 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;
24
ответ дан 1 December 2019 в 10:32
поделиться

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

Кроме того, я не понимаю, зачем вам это нужно в вашем случае. В худшем случае ничего не обновляется — никаких ошибок не будет.

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

0
ответ дан 1 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: