2009-10-17 3 views
11

Ich möchte einen trigger so einrichten, dass wenn bei einem update das prädiktionsfeld = 3 ist, der trigger den wert auf 4 setzt und in der datenbank speichert. Der Auslöser ist unten.mysql trigger stored trigger wird bereits von statement verwendet, die gespeicherten trigger aufgerufen

Aus irgendeinem Grund, den ich sagen, einen Fehler erhalte:

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

Ist dies der richtige Weg einrichten?

delimiter $$ 
CREATE TRIGGER no_BoW BEFORE UPDATE ON t FOR EACH ROW 
BEGIN set @prediction = new.prediction; 
UPDATE t SET t.prediction = (SELECT IF(@prediction = '3', '4', @prediction)) WHERE t.event_id = new.event_id AND t.price_tier = new.price_tier; END; 
$$ delimiter ; 

Antwort

41

MySQL-Trigger können nicht manipulieren, um die Tabelle, denen sie zugeordnet sind. Alle anderen großen DBMS unterstützen diese Funktion, daher wird MySQL diese Unterstützung hoffentlich bald hinzufügen.

http://forums.mysql.com/read.php?99,122354,240978#msg-240978

+0

Danke dir :) - Du hast mir geholfen – Skeen

+1

Und ich, das ist ein sehr nerviger Bug – jdborg

+8

jeden Tag hasse ich mysql mehr –

0

Außerdem müssen Sie sicherstellen, dass Sie keine anderen Prozeduren oder Funktionen haben Sie die Aktualisierungen auf dem Tisch führen, dass diese besondere Prozedur zugeordnet ist oder Sie in einer Rekursion enden. Zum Beispiel

create trigger trig1 After update on table1 FOR EACH ROW 
BEGIN 
UPDATE table2 SET colum1 = column1 + 1 
END; 

create trigger trig2 After update on table2 FOR EACH ROW 
BEGIN 
UPDATE table1 SET colum2 = column2 + 1 
END; 

Dies wird in einer Rekursion am Ende so der vorhandenen gespeicherten Prozeduren und Funktionen in Acht nehmen.