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

来源:互联网 发布:ant执行sql脚本 编辑:程序博客网 时间:2024/06/05 22:30

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