Beim Aktualisieren von Zeilen in einer Datenbank kann es nützlich sein, auf das Original zuzugreifen Werte der aktualisierten Spalten. SQL bietet zwar die RETURNING-Klausel zum Abrufen von Post-Update-Werten, unterstützt jedoch nicht das direkte Abrufen der alten Spaltenwerte. In diesem Artikel wird eine Problemumgehung zum Abrufen sowohl neuer als auch alter Spaltenwerte während eines UPDATE-Vorgangs untersucht.
Trotz der Einschränkung der RETURNING-Klausel ist es möglich, auf die ursprüngliche Spalte zuzugreifen Werte, indem die Tabelle mit sich selbst verknüpft wird. Diese Technik macht Trigger oder gespeicherte Prozeduren überflüssig.
UPDATE my_table SET processing_by = our_id_info -- unique to this worker FROM my_table AS old_my_table WHERE trans_nbr IN ( SELECT trans_nbr FROM my_table GROUP BY trans_nbr HAVING COUNT(*) > 1 LIMIT our_limit_to_have_single_process_grab ) 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;
Diese Abfrage führt die folgenden Schritte aus:
Während die Self-Join-Lösung ohne gleichzeitige Schreiblast gut funktioniert, ist sie führt zu Parallelitätsproblemen, wenn mehrere Arbeiter versuchen, dieselben Zeilen zu aktualisieren. Um dieses Problem zu beheben:
Durch die Serialisierung von Transaktionen mit der Isolationsstufe SERIALIZABLE wird sichergestellt, dass keine anderen Transaktionen während eines Vorgangs auf Daten zugreifen können. Dies kann sich jedoch auf die Leistung auswirken.
Das Sperren der bestimmten zu aktualisierenden Zeile mithilfe der FOR UPDATE-Klausel verhindert, dass andere Transaktionen sie ändern, bis der Vorgang abgeschlossen ist. Dies gewährleistet die Datenintegrität bei gleichzeitiger Beibehaltung der Leistung.
UPDATE tbl x SET tbl_id = 23 , name = 'New Guy' FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 3 FOR UPDATE) y WHERE x.tbl_id = y.tbl_id RETURNING y.tbl_id AS old_id, y.name AS old_name , x.tbl_id, x.name;
Durch die Verwendung eines Selbst-Joins und die Anwendung von Mechanismen zur Parallelitätskontrolle ist es möglich, während eines UPDATE sowohl alte als auch neue Spaltenwerte abzurufen Operation mit reinem SQL. Dieser Ansatz bietet Flexibilität und Kontrolle bei der Handhabung von Datenänderungen in Datenbanksystemen.
Das obige ist der detaillierte Inhalt vonWie kann ich alte Spaltenwerte während eines SQL-UPDATE-Vorgangs abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!