“INSERT ON DUPLICATE KEY UPDATE”更新部分字段
2013-06-22 12:20
1281 查看
之前的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操作。
语法如下:
一次插入多条记录:
这样我在wormhole中增加"INSERT ON DUPLICATE KEY UPDATE"操作,通过sql模板拼接出update多条记录的语句(比如一次更新一个batch size 1000条),提交语句,批量更新。
本文链接/article/1633043.html,转载请注明
现在有需求要支持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条),提交语句,批量更新。
本文链接/article/1633043.html,转载请注明
相关文章推荐
- mysql重复插入insert时更新ON DUPLICATE KEY UPDATE
- mysql重复插入insert时更新ON DUPLICATE KEY UPDATE
- MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.
- MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.
- SQL语句实现不存在即插入,存在则increase某字段的功能insert into … on duplicate key update
- mysql 批量更新语句 INSERT ON DUPLICATE KEY UPDATE
- mysql insert语法注意事项(ON DUPLICATE KEY UPDATE )
- (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE
- INSERT ... ON DUPLICATE KEY UPDATE
- INSERT … ON DUPLICATE KEY UPDATE
- MySQL记录存在则更新,不存在插入on duplicate key update
- INSERT INTO .. ON DUPLICATE KEY更新多行记录
- REPLACE INTO 和 INSERT INTO ... ON DUPLICATE KEY UPDATE SET ...
- MySQL的Replace into 与 Insert into on duplicate key update的不同之处
- ON DUPLICATE KEY UPDATE重复插入时更新
- INSERT ... ON DUPLICATE KEY UPDATE Syntax
- MySQL的Replaceinto与Insertinto.....onduplicatekeyupdate...真正的不同之处
- Insert into ..... on duplicate key update ...与Replace into的区别
- Mysql replace into 与 insert into on duplicate key update 的区别
- 小技巧 INSERT … ON DUPLICATE KEY UPDATE