je veux suivre l'historique des changements pour un utilisateur, de sorte que chaque fois qu'il change son profil, j'ai besoin de prendre les anciennes données et de les stocker dans l'historique et de les mettre à jour avec de nouvelles données.
Je peux utiliser un select
pour récupérer les anciennes données, un insert
pour l'historique et enfin un update
pour modifier les données.
puis-je avoir tout cela dans une seule requête dans mysql sans utiliser de procédures stockées, de déclencheurs, etc. comme utiliser des verrous, etc. si c'est le cas, donnez-moi un petit échantillon.
Réponses:
Pour ce faire , sans risque de bloquer un autre utilisateur essayant de mettre à jour le même profil en même temps, vous devez verrouiller la ligne en
t1
premier, puis utilisez une transaction (comme Rolando fait remarquer dans les commentaires à votre question):la source
Je ne pense pas qu'il existe un moyen de combiner les trois déclarations. La chose la plus proche de cela ne vous aide pas vraiment, et c'est un SET SELECT. Votre meilleur pari est un déclencheur. Voici un exemple de déclencheur que j'utilise souvent pour maintenir une telle piste d'audit (construite avec PHP):
la source
J'ai trouvé que cette requête fonctionne sur les serveurs SQL et MySQL
INSERT INTO t2 SELECT * FROM t1 WHERE id=10; UPDATE t1 SET id=11 WHERE id=10;
J'espère que cela sera utile à d'autres également à l'avenir.
la source