最近一个电商系统的会员账号数据需要汇总清算并迁移到另外一个表,涉及表字段账户数据更新,但是更新的数据是由select计算而来的。如果使用php写代码,把每一步查询结果存到内存数组,再循环更新数据库表里,也是一种方案,就是比较花时间。 为了偷懒,直接使用sql语句编程,新建了一张表,存储结算结果集,再把这张表按照关联规则更新到会员账户表。
UPDATE member m set m.balance = m.balance +
(select jiangli from account where user_id = m.id);
这里有两张表,member(id, balance) 和 account (user_id, jiangli) 想实现的结果是把account里有记录的账户 到member表 对应的用户 余额字段(balance)加上一个 奖励(jiangli).
member表大概15000条记录,需要发放奖励的用户 500条记录。
使用上面一段代码更新,导致数据更新错误,实际更新的用户大概在4000多条左右,明显结果不对。
经过再三复盘,修改sql代码如下。
UPDATE member m inner join account n on m.id = n.user_id
set m.balance = m.balance + n.jiangli;
本质原因是update关联表的原因。