Heim >Datenbank >MySQL-Tutorial >Wie kann ich Spaltenwerte vor der Aktualisierung in SQL abrufen, ohne Trigger oder gespeicherte Prozeduren zu verwenden?

Wie kann ich Spaltenwerte vor der Aktualisierung in SQL abrufen, ohne Trigger oder gespeicherte Prozeduren zu verwenden?

Linda Hamilton
Linda HamiltonOriginal
2025-01-03 18:51:39633Durchsuche

How Can I Retrieve Pre-Update Column Values in SQL Without Using Triggers or Stored Procedures?

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!

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