Heim >Datenbank >MySQL-Tutorial >Wie kann ich Spaltenwerte vor der Aktualisierung in SQL abrufen, ohne Trigger oder gespeicherte Prozeduren zu verwenden?
Abrufen von Werten vor der Aktualisierung NUR mit SQL
In einem Szenario, in dem Trigger, gespeicherte Prozeduren oder externe Entitäten nicht verfügbar sind, wird dies notwendig um die alten Werte einer Spalte aus einer Zeile abzurufen, die allein mit SQL aktualisiert wurde.
Die Herausforderung
Das Abrufen von Werten vor dem Update direkt aus der RETURNING-Klausel ist nicht möglich, da nur die Werte nach dem Update zurückgegeben werden.
Lösung mit einem Self-Join
Die Lösung besteht darin, die Tabelle mit einer anderen Instanz von sich selbst zu verknüpfen, indem eine Bedingung verwendet wird, die die zu aktualisierende Zeile eindeutig identifiziert. Dies ermöglicht den Zugriff auf sowohl die alten als auch die neuen Werte in der RETURNING-Klausel.
UPDATE my_table SET processing_by = our_id_info FROM my_table AS old_my_table WHERE old_my_table.trans_nbr = my_table.trans_nbr AND my_table.row_id = old_my_table.row_id RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
Umgang mit Parallelität
Um potenzielle Race Conditions zu vermeiden, ist es wichtig, gleichzeitige Schreibvorgänge zu verhindern während der Aktualisierung in dieselben Zeilen verschoben. Dies kann durch eine explizite Sperre der zu aktualisierenden Zeile erreicht werden:
UPDATE my_table SET processing_by = our_id_info FROM (SELECT * FROM my_table WHERE trans_nbr = 4 FOR UPDATE) AS old_my_table WHERE old_my_table.trans_nbr = my_table.trans_nbr RETURNING my_table.row_id, my_table.processing_by, old_my_table.processing_by AS old_processing_by
Dadurch wird sichergestellt, dass nur die von der Unterabfrage gesperrten Zeilen verarbeitet werden, wodurch widersprüchliche Aktualisierungen vermieden werden.
Das obige ist der detaillierte Inhalt vonWie kann ich Spaltenwerte vor der Aktualisierung in SQL abrufen, ohne Trigger oder gespeicherte Prozeduren zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!