我有一个“密钥”文件(基数顺序),如下所示:
ID
Name
Job
然后,我从错误的update语句中编辑了bin.log,格式如下:
1
'Joe'
'Grocer'
2
'Bill'
'Mason'
我需要做的是使用相应的“key”文件,形成update语句,结果如下:
update database.table set Name='Joe', Job='Grocer' WHERE ID=1;
update database.table set Name='Bill', Job='Mason' WHERE ID=2;
但是,这需要对多列数据起作用。密钥文件中的第一个字段将始终是一个主键。换句话说,update语句中的“WHERE”子句将始终使用密钥文件中的这一行。密钥文件第一行下面的所有内容都是需要按照列的出现顺序进行“设置”的列。
对于本例,ID将是WHERE子句中的列,“Name”将首先设置为bin.log中的相应行,然后设置为“Job”等,而本例在密钥文件中只有三行,可以有任意数量的行。但是,第一行将始终是用于update语句结尾“WHERE”部分的列。
最佳答案
这是一个剧本的草稿,可以满足你的要求。如果你喜欢,我们可以改进它的效率,风格,正确性。
生成_statement.sh:
#!/usr/bin/bash
read -r -a cnames <<< "$(echo $(cat cnames))"
numcols=${#cnames[@]}
counter=0; sclause=""
while read -r cvalue
do
if (( $counter == 0 ))
then
keys_value=$cvalue
elif (( $counter == $numcols-1 ))
then
sclause="$sclause, ${cnames[$counter]}=$cvalue"
read -r sclause <<< "$(echo $sclause | sed 's/,//')"
echo "update database.table set $sclause where ${cnames[0]}=$keys_value;"
sclause=""
else
sclause="$sclause, ${cnames[$counter]}=$cvalue"
fi
(( counter = ++counter % numcols))
done <<< "$(cat cvalues)"
cnames公司:
ID
Name
Job
Height
Weight
C值:
1
'Joe'
'Grocer'
60
160
2
'Bill'
'Mason'
61
170
3
'John'
'Engineer'
65
180
4
'Jack'
'Doctor'
69
190
输出:
update database.table set Name='Joe', Job='Grocer', Height=60, Weight=160 where ID=1;
update database.table set Name='Bill', Job='Mason', Height=61, Weight=170 where ID=2;
update database.table set Name='John', Job='Engineer', Height=65, Weight=180 where ID=3;
update database.table set Name='Jack', Job='Doctor', Height=69, Weight=190 where ID=4;
关于mysql - 需要根据相应的值对UPDATE语句进行论坛化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39927917/