加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 在同一个表中使用其他值更新一列

发布时间:2020-12-12 08:33:53 所属栏目:MsSql教程 来源:网络整理
导读:请考虑这个sql语句 Create table abc (A int,B int)insert into abc values (1,2) 以下两个陈述都做同样的事情.为什么? update abc set A = B,B =0where A=1 和 update abc set B =0,A = Bwhere A=1 我想在后面的语句中首先设置B列值,然后将A列的值设置为B的
请考虑这个sql语句
Create table abc 
(A int,B int
)

insert into abc values (1,2)

以下两个陈述都做同样的事情.为什么?

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

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

我想在后面的语句中首先设置B列值,然后将A列的值设置为B的值

解决方法

不可以.单个更新语句是原子的,各个部分没有顺序.

这两个:

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

做同样的事情因为两个任务被认为是同时发生的.

换句话说,=右侧的B是B的旧值.

附录:DBMS如何实现此行为取决于编写DBMS的人员的聪明才智.

例如,DBMS可能会尝试锁定A为1的所有行,然后,完成后,执行A = B,B = 0(按此顺序,因为执行引擎认为这将满足并发性,将A设置为B在更改B)之前,在每一行上.

像集合A = B,B = A这样的语句需要更多的智能,但它可以通过先保存当前行并使用其中的值来设置新行中的值来轻松地做到这一点,例如:

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

然后它将解锁所有行.

这只是一个选择.一个非常愚蠢的DBMS可能只是锁定整个数据库文件,尽管这不会产生非常智能的并发性.

单用户,单线程DBMS根本不必关心并发性.它绝对没有锁定,只是通过每个相关的行,进行更改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读