由于mysql使用不当引发的一个bug

2018-02-02  本文已影响0人  loinliao

需求

现有一个表A,A表中有一个字段metric_id,需要更新所有为nullmetric_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_idnull的行

原因

select id from A where metric_id is null limit 100000 offset 0之后将0到100000的metric_idnull的行全都更新了

随后再执行select id from A where metric_id is null limit 100000 offset 100000相当于将现在表中0到100000的metric_idnull的数据略过了

上一篇 下一篇

猜你喜欢

热点阅读