需求
现有一个表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的数据略过了