2016-08-04 75 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