2016-08-04 70 views
1

我有一个MySQL列错误地加载了数据。我创建了一个脚本,用于读取我知道弄错的1400万个主键的文本文件。我有一个基本的bash while循环,但不是为每个id发出一个单独的mysql命令,我想为一组id(我确实拥有1400万)执行此操作。使用BASH数组修改MySQL表格

目前:

while IFS='' read -r id || [[ -n "$id" ]]; do 
    mysql -e "UPDATE my_table SET direct = 1 WHERE id = $id" -u $USER -p$PASS db 
done < "$1" 

什么,我想要做的是在阅读一组的id和这样说WHERE id in ($#ids),而无需执行一堆循环和modulos的。想法?

+0

可行,但要记住正常的命令行和查询字符串的长度限制。你将只能在shell中删除/截断之前将这么多id加入到cli中。 –

+0

查询长度限制?我正在考虑在文件中读取$ STRING变量,因此$ STRING看起来像“1283792,7657887263,16876873”等,然后将其转储到'in()'子句中。 – jiveturkey

+0

mysql中的'max_allowed_pa​​cket'。任何比这更长的时间将会......不好。 –

回答

1

如果你有一个数组的ID,并且它们不包含逗号,那么你可以通过,加盟值制定的IN-这样的查询:

mysql -e "UPDATE my_table SET direct = 1 WHERE id IN ($(IFS=,; echo "${ids[*]}"))" -u $USER -p$PASS db 

这解决了一个属于你问题。

另一部分是将1400万个想法分解为可行的块。 这样的事情应该工作:

execute_update() { 
    mysql -e "UPDATE my_table SET direct = 1 WHERE id IN $(IFS=,; echo "${ids[*]}")" -u $USER -p$PASS db 
} 

ids=() 
while IFS='' read -r id; do 
    ids+=($id) 
    if [[ ${#ids[@]} = 200 ]]; then 
     execute_update 
     ids=() 
    fi 
done < "$1" 

if [[ ${#ids[@]} < 200 ]]; then 
    execute_update 
    ids=() 
fi 
+0

Oopsie,我的坏,好你可以想出来,无论如何更新了现在的帖子 – janos