Maison >base de données >tutoriel mysql >Comment récupérer les anciennes valeurs de colonnes avant une MISE À JOUR SQL ?

Comment récupérer les anciennes valeurs de colonnes avant une MISE À JOUR SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-04 07:39:38127parcourir

How to Retrieve Old Column Values Before an SQL UPDATE?

Comment récupérer les anciennes valeurs de colonne avant UPDATE en utilisant uniquement SQL

Énoncé du problème

Malgré sa fonctionnalité robuste, la clause RETURNING de SQL est confrontée à une limitation : elle récupère uniquement les valeurs post-mise à jour. Cela peut constituer un obstacle lors de la recherche des valeurs d'origine des colonnes mises à jour, en particulier dans des environnements hautement concurrents.

Solution utilisant une auto-jointure

La solution d'Erwin Brandstetter relève avec élégance ce défi en utilisant une auto-jointure. rejoignez la clause FROM :

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

En joignant à une autre instance de la table (old_my_table), la requête peut récupérer de manière transparente les valeurs avant la mise à jour.

Alternative pour les environnements simultanés

Dans les scénarios avec des charges d'écriture simultanées importantes, des mesures supplémentaires sont nécessaires pour éviter les conditions de concurrence :

  1. Niveau d'isolement sérialisable : exécutez la transaction sous le niveau d'isolement le plus strict pour empêcher d'autres transactions de en conflit.
  2. Verrouillage explicite des lignes : ajoutez une clause FOR UPDATE à la sous-requête qui récupère la ligne à mettre à jour, en garantissant que seules les lignes verrouillées sont traitées. Cette technique est plus efficace que l'utilisation d'un niveau d'isolement sérialisable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn