Trigger-Einschränkungen in MySQL: Aktualisieren derselben Tabelle
MySQL-Trigger bieten einen Mechanismus zum Ausführen automatisierter Aktionen basierend auf Datenbankereignissen. Es gibt jedoch Einschränkungen bei der Verwendung von Triggern zum Aktualisieren derselben Tabelle, in der das Ereignis seinen Ursprung hat. Dies liegt an der Einschränkung, die verhindert, dass ein Trigger eine Tabelle ändert, die bereits von der Anweisung verwendet wird, die den Trigger aufgerufen hat.
Problembeschreibung
Im bereitgestellten In diesem Szenario besteht die Aufgabe darin, eine bestimmte Zeile in einer ACCOUNTS-Tabelle zu aktualisieren, wenn eine neue Zeile in dieselbe Tabelle eingefügt wird. Die Aktualisierung muss jedoch für eine vorhandene Zeile durchgeführt werden, in der der Primärschlüssel (pk) mit dem edit_on-Wert der neuen Zeile übereinstimmt.
Trigger-Implementierung
Der vorgeschlagene Trigger Die Syntax zielt darauf ab, diese Anforderung zu erfüllen:
DELIMITER $$ DROP TRIGGER IF EXISTS `setEditStatus`$$ CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS FOR EACH ROW BEGIN update ACCOUNTS set status='E' where ACCOUNTS.pk = NEW.edit_on ; END$$ DELIMITER ;
Ausführung Fehler
Leider führt die Ausführung dieses Triggers aufgrund der zuvor erwähnten Einschränkung zu einem Fehler: „Tabelle KONTEN kann nicht aktualisiert werden ... wird bereits von der Anweisung verwendet, die diesen Trigger aufgerufen hat.“
Problemumgehung mithilfe einer gespeicherten Prozedur
Da Trigger für diesen Zweck nicht verwendet werden können, besteht ein alternativer Ansatz darin, eine zu erstellen gespeicherte Prozedur. Eine gespeicherte Prozedur ermöglicht mehrere Vorgänge innerhalb einer einzelnen Transaktion, einschließlich des Einfügens in die Tabelle ACCOUNTS und der Aktualisierung der vorhandenen Zeile.
Das Folgende ist eine gespeicherte Beispielprozedur, die die Aufgabe erfüllt:
CREATE PROCEDURE `updateAccountStatus` (IN NEW_ROW_ID INT) BEGIN -- Insert into the ACCOUNTS table INSERT INTO ACCOUNTS (user_id, edit_on, status) VALUES (NEW.user_id, NEW.edit_on, 'A'); -- Update the existing row UPDATE ACCOUNTS SET status = 'E' WHERE pk = NEW_ROW_ID; -- Commit the changes COMMIT; END
Durch Aufrufen der gespeicherten Prozedur mit der ID der neu eingefügten Zeile können sowohl die Einfüge- als auch die Aktualisierungsoperation in einer einzigen Transaktion ausgeführt werden, wodurch die Triggerbeschränkung umgangen wird.
Das obige ist der detaillierte Inhalt vonWie kann ich dieselbe Tabelle innerhalb eines MySQL-Triggers nach einer INSERT-Operation aktualisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!