Heim > Datenbank > MySQL-Tutorial > Warum blockiert MySQL Tabellenänderungen in gespeicherten Funktionen und Triggern?

Warum blockiert MySQL Tabellenänderungen in gespeicherten Funktionen und Triggern?

Barbara Streisand
Freigeben: 2024-12-07 13:16:18
Original
281 Leute haben es durchsucht

Why Does MySQL Block Table Modification in Stored Functions and Triggers?

Fehler bei gespeicherter MySQL-Funktion/Trigger: Tabellenänderung blockiert

Beim Ausführen einer gespeicherten Funktion oder eines Triggers in MySQL kann der Fehler auftreten:

Error: 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

Dieser Fehler tritt auf, wenn versucht wird, eine Tabelle aus einer gespeicherten Funktion oder einem gespeicherten Trigger heraus zu aktualisieren, was aufgrund möglicher Deadlocks oder unendlicher Rekursivität nicht möglich ist Aufrufe.

Der INSERT-Trigger, wie der bereitgestellte:

CREATE TRIGGER `capital` AFTER INSERT ON `brandnames`
FOR EACH ROW UPDATE brandnames
SET bname = CONCAT( UCASE( LEFT( bname, 1 ) ) , LCASE( SUBSTRING( bname, 2 ) ) )
Nach dem Login kopieren

versucht, die Markennamentabelle zu aktualisieren, während der INSERT-Vorgang noch aktiv ist. MySQL verhindert dies, um die Datenintegrität aufrechtzuerhalten und potenzielle Fehler zu vermeiden.

Um dieses Problem zu beheben, sollten Sie die folgenden Methoden in Betracht ziehen:

  • Zugriff auf neue Werte:Verwenden Sie NEU .Feldname, um auf die während der INSERT-Operation festgelegten Werte zuzugreifen. Dadurch können Sie abgeleitete Werte ändern, ohne die Tabelle zu beeinflussen.
  • Bevor-Trigger verwenden: Wenn möglich, verschieben Sie die Tabellenänderungslogik auf einen BEFORE INSERT-Trigger. Dadurch können Sie abgeleitete Werte festlegen, bevor das INSERT abgeschlossen ist, und so den Fehler vermeiden.

Zum Beispiel aktualisiert der folgende Trigger die Spalte „small_name“ basierend auf Werten in der Spalte „full_name“:

CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
FOR EACH ROW BEGIN
  SET NEW.small_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 blockiert MySQL Tabellenänderungen in gespeicherten Funktionen und Triggern?. 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