“INSERTONDUPLICATEKEYUPDATE”更新部分字段
之前的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
这是因为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条),提交语句,批量更新。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论