Los desencadenadores de MySQL no pueden actualizar filas en la misma tabla a la que se asigna el desencadenador. ¿Solución sugerida?

MySQL actualmente no admite la actualización de filas en la misma tabla a la que se asigna el desencadenador ya que la llamada podría volverse recursiva. ¿Alguien tiene sugerencias sobre una buena solución alternativa? En este momento mi plan es llamar a un procedimiento almacenado que ejecute la lógica que realmente quería en un desencadenante, pero me encantaría escuchar cómo otros han superado esta limitación.

Editar: un poco más de fondo según lo solicitado. Tengo una tabla que almacena las asignaciones de atributos del producto. Cuando se inserta un nuevo registro de producto principal, me gustaría que el desencadenador realice una inserción correspondiente en la misma tabla para cada registro secundario. Esta desnormalización es necesaria para el rendimiento. MySQL no es compatible con esto y arroja:

Can't update table 'mytable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Una larga discusión sobre el tema en los foros de MySQL básicamente conduce a: Usar un proceso almacenado, que es con lo que fui por ahora.

¡Gracias por adelantado!

En realidad, puede subir las filas en la misma tabla que el desencadenador. El hilo al que vinculó incluso tiene la solución.

Por ejemplo:

 TestTable ( id / lastmodified / random ) create trigger insert_lastmod before insert on TestTable for each row set NEW.lastmodified = NOW(); insert into TestTable ( `random` ) values ( 'Random' ); select * from TestTable; +----+---------------------+---------------------+ | id | lastmodified | random | +----+---------------------+---------------------+ | 1 | 2010-12-22 14:15:23 | Random | +----+---------------------+---------------------+ 

Supongo que podrías llamar al proceso almacenado en tu disparador. Sin embargo, si desea actualizar algunos campos en los mismos registros que está modificando (como una columna updatedby o lastupdated), puede hacerlo en un desencadenador anterior de acuerdo con el manual de referencia. http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

Esta es una operación común para desencadenantes y me resulta difícil creer que no es compatible.

Si desea actualizar la columna que no lee en la función de desencadenante, entonces como solución alternativa, puede colocar esa columna en una tabla separada.

En realidad puedes hacer eso. Lo siguiente es un ejemplo para el mismo

 DELIMITER $$ create trigger test2 before insert on ptrt for each row begin if NEW.DType = "A" then set NEW.PA = 500; elseif NEW.DType = "B" then set NEW.PA = 1000; else set NEW.PA = 0; END IF; END;$$ DELIMITER; 

Esto funcionó para mí: D

En Antes / Actualizar.

 BEGIN SET NEW.DateTimeUpdated = NOW(); END 
Intereting Posts