由于mysql使用不当引发的一个bug
2018-02-02 本文已影响0人
loinliao
需求
现有一个表A,A表中有一个字段metric_id
,需要更新所有为null
的metric_id
。
操作
由于A表太大,故使用go
语言写了一个程序分段更新。
程序大概逻辑如下
limit = 100000
for offset := 0; ; offset += limit {
ids = `select id from A where metric_id is null limit ? offset ?`
for _, id := range ids {
Exec(`update A set metric=xxx where id=?`, id)
}
if ids < limit {
break
}
}
bug现象
执行完程序后A
表中仍有很多metric_id
为null
的行
原因
在select id from A where metric_id is null limit 100000 offset 0
之后将0到100000的metric_id
为null
的行全都更新了
随后再执行select id from A where metric_id is null limit 100000 offset 100000
相当于将现在表中0到100000的metric_id
为null
的数据略过了