2010-12-28 16 views
14

¿Cómo puedo actualizar la columna de la tabla en un desencadenante después de la actualización en la misma tabla?
Aquí es el gatillo:Actualización de la tabla en el desencadenante después de la actualización en la misma tabla

 

CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score 
FOR EACH ROW 
    UPDATE 
     products_score 
    SET 
     products_score.votes_total = 
      (SELECT 
       (votes_1 + votes_2 + votes_3 + votes_4 + votes_5) 
      FROM 
       products_score 
      WHERE 
       id = new.id) 
 

Ahora cuando actualice la mesa como

 

UPDATE products_score SET votes_1 = 5 WHERE id = 0 
 

esto no funciona, como me sale el siguiente:

#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Entonces, ¿cómo en la tierra Puedo hacer que esto funcione?

Respuesta

26

Si cambia de gatillo para BEFORE en lugar de AFTER que podría hacerlo de esta manera:

CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score 
FOR EACH ROW 
BEGIN 
    SET new.votes_total = new.votes_1 + new.votes_2 + new.votes_3 + new.votes_4 + new.votes_5 
END 
; 
+1

Excelente respuesta – jdborg

7

no se puede tener esto de la manera que ha configurado ya un disparador no puede consultar otras filas de la misma tabla en la que está definida. Istead puede utilizar un activador de actualización Antes de toachieve lo que quiere:

CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score FOR EACH ROW  
BEGIN 
    SET NEW.votes_total = NEW.votes_1 + NEW.votes_2 + NEW.votes_3 + NEW.votes_4 + NEW.votes_5; 
END; 

O utilizar un procedimiento almacenado para actualizar la tabla.

+0

mismo mensaje de error que invoca un procedimiento almacenado dentro del activador después de la actualización – vladiastudillo

Cuestiones relacionadas