Maison > base de données > tutoriel mysql > Comment puis-je récupérer les valeurs des colonnes avant mise à jour dans SQL sans déclencheurs ni procédures stockées ?

Comment puis-je récupérer les valeurs des colonnes avant mise à jour dans SQL sans déclencheurs ni procédures stockées ?

Linda Hamilton
Libérer: 2025-01-04 07:33:34
original
769 Les gens l'ont consulté

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

Récupération des valeurs de colonnes avant mise à jour uniquement à l'aide de SQL

Récupération des valeurs d'origine des colonnes d'une ligne après une mise à jour sans utiliser de déclencheurs, stockées des procédures ou d'autres entités externes constituent un défi récurrent dans SQL. Pour résoudre ce problème, nous explorons différentes approches.

Tentatives initiales et inconvénients

Comme indiqué dans la question d'origine, utiliser FOR UPDATE avec une sous-requête contenir une clause GROUP BY n'est pas réalisable. Les jointures deviennent par conséquent irréalisables.

Solution utilisant un alias de table

La solution la plus simple consiste à joindre la table à elle-même à l'aide d'un alias de table. En alias la table, nous pouvons accéder à la fois aux valeurs originales et mises à jour. Considérez la requête de mise à jour suivante :

UPDATE my_table x
SET processing_by = our_id_info
FROM my_table y
WHERE x.trans_nbr = y.trans_nbr
AND x.row_id = y.row_id
RETURNING y.processing_by AS old_processing_by, x.processing_by;
Copier après la connexion

Gestion des opérations d'écriture simultanées

Pour éviter que les opérations d'écriture simultanées n'affectent le résultat, nous pouvons utiliser FOR UPDATE clause dans une sous-requête. Cela garantit que seule la ligne verrouillée par la sous-requête est traitée.

UPDATE tbl x
SET tbl_id = 24, name = 'New Gal'
FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 4 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;
Copier après la connexion

Autres considérations

  • Les colonnes utilisées pour l'auto-jointure doivent être uniques et non nul.
  • Il est crucial de capturer avec précision les exigences de concurrence du application.
  • L'utilisation du niveau d'isolement SERIALIZABLE peut garantir des mises à jour simultanées fiables au détriment des performances.
  • Alternativement, un verrouillage explicite à l'aide de FOR UPDATE peut offrent un équilibre entre fiabilité et performances.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal