我有一个MySQL列未正确加载数据。我创建了一个脚本,它读取了我知道搞砸的1400万个主键的文本文件。我有一个基本的bash while
循环,但不是为每个id发出一个单独的mysql命令,我想为一组id做(我毕竟有1400万)。
目前:
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)
这样的东西,而不必执行一堆循环和模数。想法?
答案 0 :(得分: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