2013-07-24 14 views
8

Ich möchte die epc Spalte immer earnings/clicks sein. Ich verwende einen AFTER UPDATE-Trigger, um dies zu erreichen. Wenn ich also dieser Tabelle 100 Klicks hinzufügen würde, möchte ich, dass der EPC automatisch aktualisiert wird.UPDATE Gleiche Zeile nach UPDATE in Trigger

Ich versuche dies:

CREATE TRIGGER `records_integrity` AFTER UPDATE ON `records` FOR EACH ROW SET 
NEW.epc=IFNULL(earnings/clicks,0); 

Und diesen Fehler:

MySQL said: #1362 - Updating of NEW row is not allowed in after trigger 

Ich habe versucht, auch mit alten, aber auch einen Fehler bekam. Ich könnte BEFORE tun, aber dann, wenn ich 100 Klicks hinzufügte, würde es die vorherigen # Klicks für den Trigger verwenden (richtig?)

Was soll ich tun, um dies zu erreichen?

EDIT - Ein Beispiel für eine Abfrage, die auf diese ausgeführt werden würde:

UPDATE records SET clicks=clicks+100 
//EPC should update automatically 

Antwort

10

Sie können nicht in einem nach Update-Trigger Zeilen in der Tabelle aktualisieren.

Vielleicht möchten Sie etwas wie folgt aus:

CREATE TRIGGER `records_integrity` BEFORE UPDATE 
ON `records` 
FOR EACH ROW 
    SET NEW.epc=IFNULL(new.earnings/new.clicks, 0); 

EDIT:

in einem Trigger, haben Sie Zugriff auf OLD und NEW haben. OLD sind die alten Werte im Datensatz und NEW sind die neuen Werte. In einem vor Trigger werden die NEW Werte, die in die Tabelle geschrieben werden, so dass Sie sie ändern können. In einem nach Trigger wurden die NEW Werte bereits geschrieben, so dass sie nicht geändert werden können. Ich denke, die MySQL documentation erklärt das ziemlich gut.

+0

Ist nicht auch ein Update nach Ihnen? – hellohellosharp

+0

@hellohellosharp. . . Irgendwie war es nicht als ich den Code angeschaut habe. ;) –

+0

Danke für die Aktualisierung - Ihre Antwort scheint zu funktionieren. Ich bin jedoch verwirrt ... würde ein BEFORE Update nicht die falschen Werte für Klicks und Einnahmen verwenden? – hellohellosharp

0

Vielleicht haben Sie zwei getrennte Aussagen in dieser Transaktion

update record set clicks=... 

update record set epc=... 

schreiben konnte oder man konnte sie in einer Funktion setzen, sagen updateClick() und rufen Sie diese Funktion. Auf diese Weise können Sie Ihre Logik leicht ändern, wenn es nötig sein sollte.

Das Einfügen der Logik in einen Trigger kann zu einer Situation führen, in der Debugging und Tracing unnötig komplex sind.