为何SQL表执行UPDATE仅更新一条记录?存储过程问题求助
存储过程仅更新最后一行的原因及解决方法
表结构
| A | B | C | D | E |
|---|---|---|---|---|
| 1000 | 5 | 2 | 2018-A | |
| 1001 | 15 | 63 | 2018-A | |
| 1002 | 25 | 124 | 2018-A | |
| 1003 | 35 | 185 | 2018-A | |
| 1004 | 45 | 246 | 2018-A | |
| 1005 | 55 | 307 | 2018-A | |
| 1000 | 65 | 368 | 2018-B | |
| 1001 | 75 | 429 | 2018-B | |
| 1000 | 85 | 490 | 2018-C | |
| 1001 | 95 | 551 | 2018-C | |
| 1002 | 105 | 612 | 2018-C | |
| 1003 | 115 | 673 | 2018-C | |
| 1004 | 125 | 734 | 2018-C |
问题代码
SELECT @A = a, @Ans = b * c FROM tbln WHERE d = '2018-A' UPDATE tbln SET e = @ANS WHERE d = '2018-A' AND a = @A
原因分析
你用SELECT语句给变量@A和@Ans赋值时,数据库会逐行遍历所有符合d='2018-A'的记录,每遍历一行就用当前行的a和b*c覆盖变量中的旧值。当遍历完成后,变量里仅保留了最后一行的a值和对应的乘积结果。后续的UPDATE语句只会匹配这个最后一行的a,所以最终只更新了最后一行数据。
解决方法
不需要通过变量中转计算结果,直接在UPDATE语句的SET子句中完成乘积计算即可,这是最简洁高效的写法:
UPDATE tbln SET e = b * c WHERE d = '2018-A'
如果你的业务逻辑确实需要使用变量(比如包含额外的复杂计算),可以使用游标逐行处理数据,但这种场景下完全没必要,上面的UPDATE语句可以一次性更新所有符合条件的行,性能远优于变量+循环的方式。
内容的提问来源于stack exchange,提问作者malan
相关产品推荐
相关产品推荐

