MySQL触发#1365除零警告,已限制upvotes范围却仍出现?
解决MySQL UPDATE语句中的“Division by 0”警告问题
警告根源:你认为
upvotes + downvotes绝不会为0,但实际是满足WHERE条件的行中存在upvotes + downvotes = 0的情况——比如downvotes为负数,刚好和范围在9-12之间的upvotes抵消,导致计算score时分母为0。定位问题行:先执行SELECT语句找出触发警告的异常数据:
SELECT id, upvotes, downvotes, mature_upvotes FROM memes WHERE ((mature_upvotes / upvotes) * 100) < 15 AND upvotes > 8 AND upvotes < 13 AND (upvotes + downvotes) = 0;
这条语句会直接筛选出符合WHERE条件且分母为0的行,你可以检查这些行的downvotes是否为负数。
- 修复方案:在计算score时添加防除以0的兜底逻辑,用
IF函数规避异常:
UPDATE memes SET upvotes = upvotes + 1, score = ROUND((upvotes * 100) / IF(upvotes + downvotes = 0, 1, upvotes + downvotes)) WHERE ((mature_upvotes / upvotes) * 100) < 15 AND upvotes > 8 AND upvotes < 13;
如果upvotes + downvotes为0,就用1作为分母避免警告。如果业务不允许downvotes为负,也可以先修正这些异常数据,再执行原UPDATE语句。
- 补充说明:你更新单条
mature_upvotes=0的行未触发警告,是因为那一行的upvotes + downvotes不为0,不存在除以0的场景。
内容的提问来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

