7
votes

Mise à jour d'une colonne avec la valeur de l'autre dans la même table

Veuillez considérer ces instructions SQL xxx pré>

Les deux états ci-dessous font la même chose. Pourquoi? P>

update abc 
set B =0,
A = B
where A=1


0 commentaires

4 Réponses :


9
votes

Non. Les relevés de mise à jour unique sont atomiques et il n'y a pas d'ordre dans leurs parties individuelles.

Tous deux: P>

read in oldrow
copy oldrow to newrow
newrow.A = oldrow.B
newrow.B = oldrow.A
write out newrow


1 commentaires

Est-ce que je lis et écrit les deux arrive en même temps? Cela ne crée-t-il aucune concurrence dans la fonctionnalité SQL Server?



3
votes

SQL n'évalue pas les valeurs par ordre de champ. Les déclarations sont identiques en ce qui concerne SQL.

La mise à jour se produit en une étape (atomique), pas plusieurs commandées.

Que se passe-t-il est que SQL accède à chaque ligne de la table, puis met à jour a à la valeur actuelle de B et la même heure mises à jour b 0.

Si cela vous aide à comprendre, vous pouvez y penser comme ce qui se passe dans un déclencheur de mise à jour, qui a accès à la valeur actuelle de la table dans la table supprimée et aux nouvelles valeurs de La table insérée la table logique.


5 commentaires

Est-ce que je lis et écrit les deux arrive en même temps? Cela ne crée-t-il aucune concurrence dans la fonctionnalité SQL Server?


Si vous observez la déclaration, je lis en réalité la valeur de B et le réglez sur A .


@ Ismail - Vous faites une mise à jour Single . SQL Server garantit que la seule mise à jour sera atomique.


D'accord. Mais vous ne pensez-vous pas que b est en cours de lecture et défini sur A ?


@ Iismail - c'est une mise en œuvre interne de détail dans SQL. L'important est que l'opération soit atomique. Comment SQL est une question différente.



0
votes

Maintenant, je comprends que, il existe deux tables logiques I.e supprimé et inséré qui entrent dans l'image lorsque nous exécutons une déclaration de mise à jour.

La valeur étant donc définie sur A est extraite à partir de la colonne B de supprimé table et la valeur de B qui est défini sur 0 est celui dans la table insérée .


0 commentaires

2
votes

Variation sur la réponse de @ Iismail: Logiquement, une mise à jour est une suppression et un insert qui sont commis ensemble, c'est pourquoi vous obtenez une ligne dans chacune des tables logiques supprimées et Inséré respectivement. L'unité de travail ici est la ligne: quand une ligne est mise à jour, elle est supprimée et réinsérée à l'aide des nouvelles valeurs (si vous souhaitez savoir quel les valeurs changent effectivement que vous devez le faire fonctionner vous-même. ).

Un aide utile-Moiire est que xxx

transposera les valeurs des colonnes "


0 commentaires