MySQL-Trigger zum Aktualisieren vorhandener Zeilen in derselben Tabelle nach dem Einfügen
Problemerklärung
Wann Eine neue Zeile wird in die Tabelle ACCOUNTS eingefügt, eine entsprechende vorhandene Zeile in derselben Tabelle, wobei der pk der edit_on-Spalte der neuen Zeile entspricht Die eingefügte Zeile muss aktualisiert werden, indem ihre Statusspalte auf „E“ gesetzt wird. Beim Versuch dieser Aktualisierung innerhalb des Triggers tritt jedoch ein Fehler auf, der besagt, dass die Tabelle bereits von der Anweisung verwendet wird, die den Trigger aufgerufen hat.
Lösung
Wegen Aufgrund der Einschränkung beim Aktualisieren einer Tabelle innerhalb eines Triggers, der bereits durch die auslösende Anweisung geändert wird, ist ein alternativer Ansatz erforderlich.
Gespeichert Prozedur
Erstellen Sie eine gespeicherte Prozedur, die sowohl die Einfüge- als auch die Aktualisierungsvorgänge in einer einzigen Transaktion abwickelt. Die erforderlichen Schritte sind wie folgt:
SQL-Syntax
CREATE PROCEDURE setEditStatus(IN NEW_pk INT, IN NEW_edit_on INT) BEGIN /* Insert new row into ACCOUNTS table */ INSERT INTO ACCOUNTS (pk, user_id, edit_on, status) VALUES (NEW_pk, /* User ID */, NEW_edit_on, 'A'); /* Update existing row */ UPDATE ACCOUNTS SET status = 'E' WHERE pk = NEW_edit_on; /* Commit changes */ COMMIT; END;
Trigger
Ändern Sie den Trigger, um stattdessen die gespeicherte Prozedur aufzurufen des Versuchs, das Update direkt durchzuführen.
DELIMITER $$ DROP TRIGGER IF EXISTS `setEditStatus`$$ CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS FOR EACH ROW BEGIN CALL setEditStatus(NEW.pk, NEW.edit_on); END$$ DELIMITER ;
Dieser Workaround ermöglicht, dass das gewünschte Update ohne durchgeführt werden kann Verstoß gegen die Einschränkung zum Aktualisieren derselben Tabelle innerhalb eines Triggers.
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich eine vorhandene Zeile in MySQL nach einer Einfügung ohne Triggersperre?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!