Heim > Datenbank > MySQL-Tutorial > Warum kann ich eine Tabelle innerhalb einer in MySQL gespeicherten Funktion oder eines Triggers nicht aktualisieren?

Warum kann ich eine Tabelle innerhalb einer in MySQL gespeicherten Funktion oder eines Triggers nicht aktualisieren?

Linda Hamilton
Freigeben: 2024-12-25 00:05:20
Original
819 Leute haben es durchsucht

Why Can't I Update a Table Within a MySQL Stored Function or Trigger?

MySQL-Fehler: Tabelle in gespeicherter Funktion/Trigger kann nicht aktualisiert werden

Frage:

Beim Versuch, mithilfe eines Triggers eine neue Zeile in eine MySQL-Tabelle einzufügen, wird der folgende Fehler angezeigt tritt auf:

Can't update table 'brandnames' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Nach dem Login kopieren

Antwort:

Dieser Fehler tritt auf, wenn der INSERT-Trigger versucht, die Tabelle zu ändern, die ihn aufgerufen hat. MySQL verbietet dieses Verhalten aus zwei Hauptgründen:

  • Sperrkonflikte: Der INSERT führt möglicherweise Sperrvorgänge aus, die zu Deadlocks führen können, wenn der Trigger auch versucht, die Tabelle zu sperren.
  • Unendliche Rekursion: Wenn der Trigger eine Zeile in derselben Tabelle aktualisiert, kann er denselben Trigger verursachen auf unbestimmte Zeit ausgelöst werden, was zu einer Endlosschleife führt.

Um diesen Fehler zu beheben, sollten Sie die folgenden Ansätze in Betracht ziehen:

  • Zugriff auf neue Werte: Anstatt die Tabelle im Trigger zu ändern, verwenden Sie NEW.fieldname, um auf die neu eingefügten Werte zuzugreifen und andere Felder festzulegen entsprechend.
  • Änderung vor dem Einfügen: Verwenden Sie einen BEFORE INSERT-Trigger, um die Werte zu ändern, bevor sie in die Tabelle eingefügt werden. Dadurch wird das Problem der unendlichen Rekursion vermieden.

Um beispielsweise ein Kurznamenfeld aus den ersten beiden Zeichen eines vollständigen Namens zu erstellen, kann der folgende BEFORE INSERT-Trigger verwendet werden:

CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
FOR EACH ROW BEGIN
  SET NEW.short_name = CONCAT(UCASE(LEFT(NEW.full_name,1)) , LCASE(SUBSTRING(NEW.full_name,2)))
END
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum kann ich eine Tabelle innerhalb einer in MySQL gespeicherten Funktion oder eines Triggers nicht aktualisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage