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

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

Linda Hamilton
Libérer: 2025-01-03 18:51:39
original
668 Les gens l'ont consulté

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

Récupération des valeurs de pré-mise à jour à l'aide de SQL UNIQUEMENT

Dans un scénario où les déclencheurs, les procédures stockées ou les entités externes ne sont pas disponibles, cela devient nécessaire pour récupérer les anciennes valeurs d'une colonne à partir d'une ligne qui a été mise à jour en utilisant SQL uniquement.

Le Challenge

Récupérer les valeurs de pré-mise à jour directement à partir de la clause RETURNING n'est pas possible car elle ne renvoie que les valeurs de post-mise à jour.

Solution utilisant une auto-jointure

La solution consiste à joindre la table à une autre instance d'elle-même en utilisant une condition qui identifie de manière unique la ligne en cours de mise à jour. Cela permet d'accéder à la fois aux anciennes et aux nouvelles valeurs dans la clause RETURNING.

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
Copier après la connexion

Gestion de la concurrence

Pour éviter d'éventuelles conditions de concurrence critique, il est crucial d'empêcher les écritures simultanées. aux mêmes lignes lors de la mise à jour. Ceci peut être réalisé en utilisant un verrou explicite sur la ligne à mettre à jour :

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
Copier après la connexion

Cela garantit que seules les lignes verrouillées par la sous-requête sont traitées, évitant ainsi les mises à jour conflictuelles.

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