2010-12-28 13 views
14

Come aggiornare la colonna della tabella in un trigger dopo l'aggiornamento sulla stessa tabella?
Ecco il grilletto:Aggiornamento tabella in trigger dopo l'aggiornamento sulla stessa tabella

 

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) 
 

Ora quando aggiorno il tavolo come

 

UPDATE products_score SET votes_1 = 5 WHERE id = 0 
 

questo non funziona, come ottengo il seguente:

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

Così come sulla terra Posso farlo funzionare?

risposta

26

Se si cambia il grilletto per BEFORE invece di AFTER si potrebbe fare in questo modo:

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

Risposta eccellente – jdborg

7

Non si può avere questo il modo in cui si dispone di messa a punto, perché un trigger non può interrogare altre righe della stessa tabella su cui è definita. Istead è possibile utilizzare un trigger prima dell'aggiornamento toachieve ciò che si vuole:

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; 

Oppure utilizzare una stored procedure per aggiornare la tabella.

+0

stesso messaggio di errore che chiama una procedura memorizzata all'interno del trigger dopo l'aggiornamento – vladiastudillo

Problemi correlati