Heim > Datenbank > MySQL-Tutorial > Wie kann ich alte Spaltenwerte während eines SQL-UPDATE-Vorgangs abrufen?

Wie kann ich alte Spaltenwerte während eines SQL-UPDATE-Vorgangs abrufen?

Mary-Kate Olsen
Freigeben: 2025-01-04 09:42:35
Original
120 Leute haben es durchsucht

How Can I Retrieve Old Column Values During an SQL UPDATE Operation?

Alte Spaltenwerte während eines UPDATEs mit reinem SQL abrufen

Einführung

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.

Lösung mit einem Self-Join

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

Diese Abfrage führt die folgenden Schritte aus:

  1. Filtert und identifiziert Zeilen, die mithilfe einer Unterabfrage aktualisiert werden sollen.
  2. Verknüpft die Tabelle mithilfe eines Alias ​​(old_my_table) mit sich selbst, um auf die Originalspalte zuzugreifen Werte.
  3. Setzt processing_by auf our_id_info und verknüpft nur bei übereinstimmenden Zeilen-IDs.
  4. Gibt die Zeilen-ID, den neuen processing_by-Wert und den alten processing_by-Wert zurück.

Vermeiden Probleme mit gleichzeitigen Schreibvorgängen

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:

Serialisierbare Isolationsstufe

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.

Explizite Sperrung

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

Fazit

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!

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