使用BASH数组修改MySQL表

时间:2016-08-04 17:02:12

标签: mysql bash

我有一个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)这样的东西,而不必执行一堆循环和模数。想法?

1 个答案:

答案 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