Heim > Datenbank > MySQL-Tutorial > Wie aktualisiere ich eine vorhandene Zeile in MySQL nach einer Einfügung ohne Triggersperre?

Wie aktualisiere ich eine vorhandene Zeile in MySQL nach einer Einfügung ohne Triggersperre?

Patricia Arquette
Freigeben: 2024-12-13 00:28:09
Original
806 Leute haben es durchsucht

How to Update an Existing Row in MySQL After an Insert Without Trigger Locking?

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:

  1. Fügen Sie die neue Zeile in die Tabelle ACCOUNTS ein.
  2. Aktualisieren Sie die vorhandene Zeile, wobei pk mit der edit_on-Spalte der neu eingefügten Zeile übereinstimmt, und legen Sie den Status fest Spalte zu „E“.
  3. Übernehmen Sie die Transaktion, um die abzuschließen Änderungen.

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;
Nach dem Login kopieren

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 ;
Nach dem Login kopieren

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!

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