之前的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,转载请注明