sql 请教update语句in多个值时,进行多次更新

说实话,在数据库行业,Update语句用得比喝冷水还多。
你提到的那种使用临时表的更新在SQL Server中确实是一个非常有趣的操作,特别适合执行一些花哨的操作,例如批量数据更新。

我之前修改一个电商系统的订单时也遇到过类似的情况。
当时的要求是批量更新库存,但价格变化特别复杂——有的产品要乘系数,有的要加固定金额,还有限价规则。
直接一一写更新太慢了。
最后我建了两张临时表,一张存储原始数据,一张存储计算值,最后将它们加入到主表中。
那天晚上我调试了三遍,每次看到tblUpdate的Total列从NULL变成数字时,就像看魔术一样。

您提到的步骤中,有几点我认为值得深思: 1 . 创建临时表时,使用 tblUpdate 这样的名称实际上是相当明智的。
光看名字就知道用途了。
我曾经想出“temp1 ”这样的名字,但最终就像大海捞针一样。
2 .我特别欣赏你写“Total=numprice”的方式。
编写代码时,直接用SQL编写业务逻辑比先计算结果再更新要高效得多。
但请注意,如果数字和价格都是浮点数,则可能需要考虑精度问题 - 上次我运行汇率表时,结果有 0.0001 的差异。
我花了很长时间调试,发现浮点精度是罪魁祸首。
3 . 至于你提到SQL就像关系代数并且超越关系代数,我非常同意。
记得刚入行的时候,我一直认为SQL JOIN是一个固定的操作,但是当我遇到了Left Join时,我就卡住了很长一段时间。
后来我发现SQL有一套新的动态关系,可以处理关系代数无法处理的实时计算。
这就是它的力量。

一个小建议是,当你演示这个操作时,你可以添加一些错误情况。
例如,如果你故意把price打成prcie(拼写错误),看看SQL中报了什么错误,然后将执行计划的变化与正确的写法进行比较。
这种比较比仅仅观看确切的演示更有意义。
我在学习SQL优化的时候,写了where条件和条件,但是我花了很长时间才意识到这是一个逻辑错误。
我印象非常深刻。

顺便说一句,我最近遇到了你提到的堆叠功能。
我曾经给一个有 1 亿条记录的表添加索引。
老板逼我,所以我就直接用聚集索引了。
结果数据库服务突然崩溃了五分钟。
后来查了资料,发现对聚集索引重新排序是一个重量级的操作,相当于移动整个表。
这一点可以在演示时提及,因为很容易初学者会遇到麻烦。

你一步步解释的方法非常好。
比我以前直接贴大块代码的更清晰。
但要说最神奇的操作,我见过有人使用临时表进行数据共享——比如分组更新不同地区的产品价格,将地区代码存储在临时表中,然后使用 ROW_NUMBER() 进行动态页面。
这种冷操作比简单地更新NULL值更具有实用价值。

SQL更新语句的语法是什么 SQL更新语句完整语法解析一看就会

记得上次帮同事调试数据库的时候,他的update语句漏掉了WHERE。
结果,餐桌价格上涨了1 0%,系统卡住了十分钟。
最后,整个数据库就可以备份和恢复了。
这让我想起了优化更新语句的一些技巧。

索引优化非常实用。
比如我们公司的电商系统,每次更新一个库存的时候,突然发现customer_id没有被索引。
我检查过它在开发过程中被遗忘了。
快速创建索引后,批量更新速度快了8 0%。
具体数字我不记得了,但同事告诉我,以前我要等三杯咖啡冷却,但现在我只需一杯咖啡就可以喝完。
创建索引的命令其实很简单,只需 CREATE INDEX idx_customer_id ON order(customer_id);
临时表方法对于批量更新特别有用。
去年财政部想调整季度奖金。
当数据导出时,发现了数千条条目。
直接更新每一项都会锁板半天。
然后我教他们使用临时表,先加载数据,然后通过JOIN更新,这样效率要高得多。
我记得测试的时候调整了两百条数据,优化前后相差十分钟。
现在具体步骤如下: sql 创建临时表 temp_bonus(id INT, new_amount DECIMAL(1 0,2 )); 插入 temp_bonus 值 (1 01 , 5 000), (1 02 , 4 5 00); 更新人员 SET 奖金 = (从 temp_bonus 中选择新金额,其中 temp_bonus.id = 员工.id) WHERE EXISTS (SELECT 1 FROM temp_bonus WHERE temp_bonus.id =employee.id); DROP GOODBYE TEMPORARILY temp_bonus;
等等,我突然想到了 JSON 操作部分。
我们最近推出了新的会员系统和 JSON 格式的用户偏好设置。
更新的时候总是出现问题。
有一次半夜检查发现JSON_SET语法写错了。
因此,1 00,000条更新的用户数据的电子邮件通知设置变得无效。
使用嵌套子查询最终花了三个小时来修复。
具体错误代码为: sql 更新用户设置首选项 = JSON_SET(首选项, '$.email_notifications', 'false') WHERE user_id = 1 2 3 ;
这就引出了一个问题,JSON 更新真的比常规更新慢很多吗?我们测试的时候,更新常规字段和JSON字段的时候,是否应该为后者设置一个超时阈值呢?