2011-02-04 30 views
5

Tengo dos tablas de MySQL. Una tabla de votos (id, userId, postId, voteTypeId), y una tabla de mensajes (id, postTypeId, userId, parentId). Estoy escribiendo un disparador que dispara después de insertar en los votos.¿Cómo puedo usar un disparador para actualizar una tabla diferente en MySQL?

Me gustaría que el activador actualice una publicación en la tabla de publicaciones. Pero esta publicación no es la misma a la que se hace referencia en mi tabla de votos en postId; Es el padre de esa publicación.

BEGIN 
CASE NEW.voteTypeId 
    WHEN 2 THEN UPDATE posts SET posts.acceptedAnswerId = NEW.postId WHERE posts.id = @the parent postId of NEW.postId 
    ELSE 
     BEGIN 
     END; 
    END CASE; 
END 

He intentado utilizar esto en vez de @ el padre de ...:

(SELECT posts.parentId FROM posts WHERE posts.id = NEW.postId) 

Pero no creo que se puede hacer en SELECTS disparadores a menos que utilice algún tipo de sintaxis SELECT INTO . Mi única referencia a la publicación principal que deseo actualizar es su hijo postId al que se hace referencia en los votos. Así que no sé cómo hacer la actualización sin tomar la identificación correcta a través de una selección.

¿Esto es posible?

+0

Se puede hacer, de hecho, un SELECT dentro de un gatillo. Sin embargo, su otra sintaxis se ve un poco apagada. – Mchl

+0

@Mchl, probé algunas combinaciones, pero no funcionó. ¿Puedes señalarme lo que estoy haciendo mal? – Mohamad

Respuesta

2

lo haría así:

BEGIN 
    IF (NEW.voteTypeId = 2) THEN 
    UPDATE 
     posts AS p 
    CROSS JOIN 
     posts AS p2 
    ON 
     p.id = p2.parentId 
    SET 
    p.acceptedAnswerId = NEW.postId 
    WHERE 
    p2.id = NEW.postId; 
    END IF; 
END 
+0

gracias por eso. ¿Puedo preguntarte por qué usas una combinación cruzada? ¿Por qué no solo una unión normal con un alias? – Mohamad

+1

En MySQL 'INNER JOIN' y' CROSS JOIN' y 'JOIN' son todos equivalentes. De hecho, de acuerdo con la especificación ANSI SQL, debería haber usado 'INNER JOIN' aquí (porque utilicé la condición' join' join en lugar de 'USING()'). Funcionalmente no hace ninguna diferencia, pero potencialmente omprove la portabilidad. – Mchl

Cuestiones relacionadas