“INSERT ON DUPLICATE KEY UPDATE”更新部分字段

之前的wormhole(我们开发的大规模批量数据传导工具,类似apache的sqoop,淘宝的datax)的mysql writer支持insert into 和 replace into两种方式入mysql表。

现在有需求要支持update部分字段操作,比如计算完的一堆商户ID(ShopID)和对应PageView总数(ViewTotal),需要更新到一张多字段的Shop表对应字段中(ShopID是主键),如果还是用insert into会抛duplicated key exception ,而如果使用replace into方式,虽然对应字段会更新成功,但是对其他字段会自动设置成NULL或默认值。

这是因为replace into一旦发现有相同的primary key或unique key需要更新的话,会先delete掉之前的record,再重新插入一条(相当于两次操作),这样导致之前那条record中其他不需要update的字段数据也没了,而且会有这种情况,若此表有一个auto-increment key,删除中间一条record后,会在最后插入一行,自增key就是最后值,而不是之前的,而且delete后,索引会失效,再insert重建索引,效率也比较低,这不是我们预期的效果。


后来和DBA沟通,可以使用“INSERT ON DUPLICATE KEY UPDATE”语法,mysql 4.1版引入了这个new feature。

我们要insert的字段中有primary key或unique key冲突时它只会做指定的update操作,其余情况做insert操作。

语法如下:

INSERT INTO  
   Shops 
SET 
   shopid = 10000,
   viewtotal = 555555
ON DUPLICATE KEY UPDATE
   viewtotal = 555555

一次插入多条记录:

insert into
​   Shops(shopid, viewtotal) 
values(1,123456), 
(2, 234567),
(3, 345678)
on duplicate key update 
  shopid = values(shopid),
  viewtotal = values(viewtotal)

这样我在wormhole中增加"INSERT ON DUPLICATE KEY UPDATE"操作,通过sql模板拼接出update多条记录的语句(比如一次更新一个batch size 1000条),提交语句,批量更新。



本文链接http://blog.csdn.net/lalaguozhe/article/details/9150049,转载请注明

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值