AWK批量处理SQL语句

需求

更新表的某个字段,DBA要求一条SQL语句不能超过5000行,且必须主键更新(行锁),且更新完后需要sleep 3秒;
以前处理这种数据的时候,都是用excel,但是excel处理大量数据的时候可能就会崩溃。。。而且对于某些特定行的处理不是很方便(其实是我菜,不会excel),为了更好的处理数据,

脚本

查阅shell资料,憋出了如下awk脚本,命名为awk_data.awk文件,

BEGIN{
    printf "update table set is_ok=1 where table_id in (\n"
}

{
    if(NR%100 == 0)
        printf $1");\n select sleep(3);\n update table set is_ok=1 where table_id in (\n"
    else
        printf $1",\n"
}

END{
    printf ");"
}

终端中输入

awk -f awk_data.awk data > temp

得到如下结果

update table set is_ok=1 where table_id in (
    1,
    2,
    ......
    100);
     select sleep(3);
    ......
    ......
    199999,);

bug

可以看到,最后一行多出了一个逗号,会导致SQL语法错误。其实解决办法有多种。

fix bug

第一种就是判断行号是否是最后一行,如果是最后一行,无需加逗号输出。这种办法很笨,因为AWK不是很好获取最后一行。换一种思路,我们可以将上一行的逗号放到下一行开头输出,这样我们只要判断第一行行首,无需加逗号就行了
第二种就是手动删除最后的逗号,让语法正确,我是不是很机智。。。
第三种是在最后END的代码块里一行加一个不存在的主键ID,即

END{
    printf "-1);"
}

转载于:https://www.cnblogs.com/boboshenqi/p/10710744.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值