Tengo 2 tablas: comments
y comments_likes
.Realice una consulta en mysql sin invocar un desencadenador (Cómo deshabilitar un desencadenador)
comentarios
id
message
likes
desencadena:
DESPUÉS DE ELIMINAR
DELETE FROM comments_likes WHERE comment_id = OLD.id;
comments_likes
id
comment_id
desencadena:
después Insertar
UPDATE comments SET likes = likes + 1 WHERE comments.id = NEW.comment_id;
DESPUÉS DE ELIMINAR
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
después de la actualización
**omited code, updates comments**
Entonces la pregunta es, puedo desactivar los disparadores cuando se activa desde otro gatillo?
Lo que quiero es hacer algo le gusta a:
DESPUÉS DE ELIMINAR
IF NOT called_from_another_trigger() THEN
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
END IF;
[EDIT]
una solución no sería optimizado (consulta muy lento ... realiza una consulta para cada registro 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
ACTUALIZACIÓN LOW PRIORITY
y IGNORE
no funciona.
[EDIT 2]
Tengo otra idea, es posible establecer una variable global en el primer gatillo y leerlo desde el otro gatillo?
Ex:
primer disparador:
@disable_triggers = true;
// do the stuff that calls another triggers
@disable_triggers = false;
otro desencadenante:
if @disable_triggers = false then
// do the stuff
end if;
¡Innecesario! ¿Puedes realmente desactivar los disparadores dentro de un gatillo? – Mchl
@Mchl: Sí, con este método puedes :) @var son globales para la conexión. Debe usar IS NULL porque las variables que no se han definido siempre son NULL. – Wiliam
¡esto me ayudó 4 años después! Estaba buscando exactamente algo como esto. después de 1 hora de googlear y buscar SO, finalmente encontré tu respuesta. es tan fácil, pero nunca lo hubiera averiguado solo. simplemente no estoy acostumbrado a poder "programar" con mysql. –