Mi disparador MySQL no funciona, syntax simple, no complicada

No sé por qué mi desencadenante no funciona, la consulta funciona cuando lo uso de forma manual, pero cuando quiero que un desencadenador lo actualice no funciona. ¿Alguien puede ayudarme a saber por qué?

Aquí está mi disparador:

CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table` FOR EACH ROW BEGIN IF (NEW.played_games  OLD.played_games) THEN update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1)); END IF; END 

Simple, es para un torneo deportivo, cuando la persona de estadística captura el puntaje del juego, automáticamente agrega un juego_juego y es su respectivo won, empate o juego perdido, por lo que mi trigger debería ejecutarse automáticamente cuando jugaba_games cambia y tiene que cambiar el Columna PTS. Pero no está funcionando.

Además, cuando edito la columna played_games manualmente, aparece este error: “No se puede actualizar la tabla pos_table en la función almacenada / disparador porque ya está siendo utilizada por la statement que invocó esta función / activador almacenado”.

Una función almacenada o activador no puede modificar una tabla que ya está siendo utilizada (para lectura o escritura) por la instrucción que invoca la función o desencadenador.

desde: restricciones del progtwig almacenado .

Generalmente, con un desencadenador que se dispara en la inserción, si desea cambiar el valor que se está insertando, haga que el desencadenador sea del tipo BEFORE INSERT y cambie los valores en NEW

También notó que la siguiente statement no es lo que quiere de todos modos.

 update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1)); 

Actualiza toda la tabla mientras que creo que solo estás tratando de actualizar una fila específica. De todos modos, este es un cálculo simple, por lo que realmente no necesita almacenar esta columna. También puede calcular el valor en el tiempo de visualización y hacer que su código sea mucho más simple + evitar el problema con el desencadenador.

Este código se dispara a sí mismo. Bucle infinito o desbordamiento de stack ….

Como @ e4c5 mencionó, incluso si su desencadenante podría actualizar la misma tabla (no puede), su ACTUALIZACIÓN afectaría todas las filas de la tabla, no solo la única fila que se está actualizando actualmente.

Si desea un activador que modifique los valores en la fila que se está actualizando, puede usar SET :

 CREATE TRIGGER `upd_PTS` BEFORE UPDATE ON `pos_table` FOR EACH ROW BEGIN IF (NEW.played_games <> OLD.played_games) THEN SET NEW.PTS = NEW.won_games*2 + NEW.tie_games*1; END IF; END 

También tenga en cuenta que no puede cambiar los valores en la fila que provocó la ejecución del desencadenador, a menos que lo haga en un desencadenante BEFORE .