Heim >Datenbank >MySQL-Tutorial >Wie kann der durch MySQL-Trigger verursachte Tabellenaktualisierungsfehler behoben werden?

Wie kann der durch MySQL-Trigger verursachte Tabellenaktualisierungsfehler behoben werden?

DDD
DDDOriginal
2024-12-26 22:44:13219Durchsuche

How to Resolve the MySQL Trigger-Induced Table Update Error?

Trigger-induziertes Tabellenaktualisierungsdilemma

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.

Beispiel: Berechnen der Spaltensummen

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.

Das Dilemma lösen

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn