Heim >Datenbank >MySQL-Tutorial >Wie kann der durch MySQL-Trigger verursachte Tabellenaktualisierungsfehler behoben werden?
Eine häufige Herausforderung entsteht, wenn versucht wird, dieselbe Tabelle innerhalb ihres eigenen Triggers nach einer Aktualisierung zu aktualisieren. Dies wird deutlich, wenn ein Trigger so konzipiert ist, dass er eine bestimmte Spalte in der Tabelle basierend auf Änderungen an anderen Spalten in derselben Zeile ändert.
Stellen Sie sich das folgende Szenario vor: Wir möchten die Spalte „votes_total“ in der Tabelle „products_score“ jedes Mal aktualisieren, wenn eine Punktzahl geändert wird:
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)
Allerdings am Beim Ausführen einer Aktualisierung der Tabelle stoßen wir auf einen Fehler:
#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Dieser Fehler wird durch den Zirkelverweis in der Logik des Triggers verursacht. Die Update-Anweisung versucht, die Spalte „votes_total“ zu ändern, auf die sich der Trigger auch zur Berechnung der neuen Gesamtsumme stützt.
Um dieses Problem zu umgehen, können wir den Trigger auf ändern vor dem Update ausführen statt danach:
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 ;
In diesem modifizierten Trigger berechnen wir den neuen „votes_total“-Wert und weisen ihn dem zu „neues“ Zeilenobjekt, bevor die eigentliche Aktualisierung erfolgt. Dadurch kann die Update-Anweisung fortgesetzt werden, ohne dass ein Zirkelverweisproblem auftritt.
Das obige ist der detaillierte Inhalt vonWie kann der durch MySQL-Trigger verursachte Tabellenaktualisierungsfehler behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!