SQL UPDATE行更新顺序疑问:为何性别值交换CASE语句有效?
SQL UPDATE语句的执行逻辑疑问
示例数据与有效语句
假设有如下Salary表:
| id | name | sex | salary |
|---|---|---|---|
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
执行以下交换sex列值的UPDATE语句可正常生效:
update Salary set sex = case when sex = 'm' then 'f' when sex = 'f' then 'm' else sex end
核心疑问与解答
习惯使用R(data.table)和Python(pandas)的开发者会发现,这类语言中直接在原列上执行类似交换操作会失效——因为它们是顺序执行,修改后的值会被后续行的计算复用,必须先复制原始列才能完成转换。
SQL的UPDATE语句是基于执行前的数据快照整体处理的:所有用于计算新值的字段,都是这条语句启动时的原始数据,不会因为某一行的提前更新而影响其他行的计算逻辑。
拿上面的例子来说,所有行的sex判断都是用更新前的原始值:id=1的'm'转成'f',id=2的'f'转成'm',整个计算过程互不干扰,最后统一将计算好的新值写入表中,所以不需要额外复制列就能完成交换操作。
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

