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

请考虑这个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根本不必关心并发性.它绝对没有锁定,只是通过每个相关的行,进行更改.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03