如何基于MySQL原有数据随机调整wallet表amount字段数值
逻辑对比结论
你给出的SQL和PHP实现的逻辑不完全等价,核心差异是:
- PHP的
rand(-20, 20)会生成-20到+20之间的所有整数,包含0,也就是支持不做任何调整的0%幅度场景 - 你写的SQL中
FLOOR(1 + RAND() * 20)只会生成1到20的整数,配合随机正负后调整幅度只有±1%到±20%,缺少0%的情况,和PHP逻辑不一致
等价SQL实现
如果要完全对齐PHP的效果,直接用以下语句即可:
UPDATE `wallet` SET `amount` = `amount` * (1 + (FLOOR(RAND() * 41) - 20) / 100);
逻辑说明:
RAND() * 41会生成0~40.999...区间的随机浮点数- 用
FLOOR()取整后得到040的整数,减去20就得到和`rand(-20,20)`完全一致的-20+20的整数 - 除以100得到百分比调整系数,乘以原
amount值就得到调整后的结果
补充优化建议
如果amount是金额类的decimal字段,怕出现精度问题,可以按需加ROUND()保留指定小数位,比如保留2位小数的写法:
UPDATE `wallet` SET `amount` = ROUND(`amount` * (1 + (FLOOR(RAND() * 41) - 20) / 100), 2);
内容的提问来源于stack exchange,提问作者Lito
相关产品推荐
相关产品推荐

