Heim  >  Artikel  >  Datenbank  >  Warum kann ich eine Tabelle nicht innerhalb eines Triggers aktualisieren, der dieselbe Tabelle in MySQL ändert?

Warum kann ich eine Tabelle nicht innerhalb eines Triggers aktualisieren, der dieselbe Tabelle in MySQL ändert?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-08 22:52:02711Durchsuche

Why Can't I Update a Table Inside a Trigger That's Modifying the Same Table in MySQL?

Fehlerbehebung bei Triggern: Inkompatibilität mit Tabellenänderungen

In MySQL sind Trigger ein leistungsstarkes Tool zur Automatisierung von Datenbankaktionen basierend auf bestimmten Ereignissen. Wenn jedoch bei der Ausführung eines Triggers Probleme auftreten, ist die Fehlerbehebung von entscheidender Bedeutung. In diesem Artikel wird ein häufiger Fehler behandelt, der auftritt, wenn ein MySQL-Trigger nicht funktioniert.

Problembeschreibung:

Ein Benutzer hat gemeldet, dass sein Trigger eine bestimmte Spalte (PTS) nicht aktualisiert ), wenn sich die entsprechende Spalte „played_games“ in der pos_table änderte. Obwohl die Abfrage manuell funktionierte, konnte der Trigger keine Aktualisierung auslösen.

Triggerstruktur:

CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table`
FOR EACH ROW BEGIN
    IF (NEW.played_games <> OLD.played_games)
    THEN  
        update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
    END IF;
END

Fehler aufgetreten:

Beim Versuch, die Spalte „played_games“ manuell zu bearbeiten, erhielt der Benutzer eine Fehlermeldung mit der Meldung: „Die Tabelle pos_table in der gespeicherten Funktion/dem gespeicherten Trigger kann nicht aktualisiert werden, da sie bereits von der Anweisung verwendet wird, die diese gespeicherte Funktion/diesen gespeicherten Trigger aufgerufen hat.“

Lösung:

Das Problem entstand aus der Tatsache, dass der Auslöser versuchte, dieselbe Tabelle (pos_table) zu ändern, auf die im auslösenden Ereignis (Aktualisierung der gespielten_Spiele) verwiesen wurde. Wie in den gespeicherten Programmbeschränkungen von MySQL dokumentiert, kann eine gespeicherte Funktion oder ein gespeicherter Trigger keine Tabelle ändern, die bereits von der aufrufenden Anweisung verwendet wird.

Alternative Lösung:

Zu vermeiden Bei diesem Problem wird empfohlen, stattdessen einen BEFORE INSERT-Trigger zu verwenden. In diesem Fall könnte der Auslöser wie folgt geändert werden:

CREATE TRIGGER `upd_PTS` BEFORE INSERT ON `pos_table`
FOR EACH ROW BEGIN
    SET NEW.PTS = ((NEW.won_games*2)+(NEW.tie_games*1));
END

Zusätzliche Überlegungen:

Zusätzlich zum aufgetretenen Fehler hebt der Artikel auch das Problem mit hervor Speichern einer berechneten Spalte wie PTS. Da es während der Anzeige leicht aus anderen Spalten berechnet werden kann, ist es möglicherweise effizienter und weniger fehleranfällig, es nicht als separate Spalte zu speichern.

Das obige ist der detaillierte Inhalt vonWarum kann ich eine Tabelle nicht innerhalb eines Triggers aktualisieren, der dieselbe Tabelle in MySQL ändert?. 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