带有LIMIT的MySQL查询并按块更新数据

时间:2019-05-19 18:40:45

标签: javascript mysql node.js

我的mysql数据库中有一个表,其中有列iddrivers_license_number。现在drivers_license_number列中的数据以纯文本存储,我想对其进行加密。

此表包含大约400000条记录。我已阅读有关LIMIT和OFFSET问题的信息,并尝试在我的查询中使用后行查找。

因此,首先我需要从db获取数据,然后加密正确的字段并使用此加密字段更新db。我不明白如何组织代码以将具有限制和偏移量的参数发送到db。在这种情况下我需要循环工作吗?

function getUpdatedEncryptedField(db_table_name, field_name) {
    return getDataFromDb(db_table_name, field_name).then(function(result){
        return encryptData(result, field_name).then(function (result){
            var promises = result.map(function(item) {
                var data = [item[field_name], item.id];
                return updateFieldNameData(db_table_name, field_name, data);
            });
            return q.all(promises);
        });
    });
} 

第一次通过之后,我将获得例如前1000条记录,以及如何继续获得另外1000行?

function getDataFromDb(db_table_name, field_name, limit, offset) {
    var sql = 'SELECT ds.id, ' + field_name + ' FROM ( SELECT id FROM ' + db_table_name + 'WHERE ' + field_name +
        ' IS NOT NULL ORDER BY id LIMIT ' + limit + ', ' + offset + ') d  JOIN ' + db_table_name + ' ds ON ds.id = d.id ORDER BY ds.id;'
    return db.modio.executeSql(sql);
}

1 个答案:

答案 0 :(得分:0)

您可以使用carring / highorder函数将数据块更新例如1000,并获取接下来的1000条记录,直到400000,如下所示:

function getUpdatedEncryptedField(db_table_name, field_name) { var idFrom = 0; var idTo = 1; return function getDataFromDB(db_table_name, field_name){ idFrom = idTo; idTo += 1000; console.log( id范围是$ {idFrom}-$ {idTo}`);                 //调用您的数据库以获取提示        }     }

// assign high order func to updateChunks var, which is again a func
var updateChunks = getUpdatedEncryptedField('studentsDB','creditCard')

// so each time you execute updateChunks() the values idFrom & idTo are updated
// updateChunks()
//  id range is 1-1001
// updateChunks()
//  id range is 1001-2001
// and so on

// create a loop until you get all the table records, e.g.
// pay attention to define 'i' with let and not with var because of async loop
for(let i=0; i <= 400000/1000; i++){
   // call the updateChunk func here
   // at eaach itteration it will ask for the next chunk of records
    updateChunks()
 }

`

当然,您应该稍微更新一下mysql查询,以将Ids的范围从-扩展到问题范围之外。

希望有帮助,祝你好运。