具有重复密钥更新的多个插入

时间:2013-03-21 15:10:48

标签: mysql syntax insert increment on-duplicate-key

我想要实现的与此示例类似

Singular Upon Key Insert

然而,我的不同之处在于我试图同时进行多次插入。我正在更新很多行。

我希望插入增加会话数量,如果它是重复的

以下(精简版)会导致语法错误,但它应该解释我想要实现的目标

INSERT INTO
`pc_tech`.session_route_data (session_volume,country_origin, pu_date)

VALUES

('1','Switzerland','2012-01-01')
ON DUPLICATE KEY UPDATE  `session_volume` = `session_volume`+1,

('8','Ireland','2012-01-01') 
ON DUPLICATE KEY UPDATE `session_volume` = `session_volume`+8,  

('3','UK','2012-01-01')
ON DUPLICATE KEY UPDATE `session_volume` = `session_volume`+3

已修改更改了插入的值,以便根据下面的注释

匹配重复值

1 个答案:

答案 0 :(得分:1)

每次upsert你都需要做一个声明。 RDBMS安排连续的upsert是没有意义的,就像调度连续插入一样。在连续插入的示例中,RDBMS可以通过执行一次质量插入(一次空间分配,一次写入磁盘,而不是每个语句一次)来提高性能。在upserts的示例中,这些增益无法保证,实际上如果所有的语句最终都是更新而不是插入,那么你就会浪费时间,而不是获得它(你浪费时间分配你不需要的空间,你不能像提前插入那样提前知道哪些块。)因此,大多数RDBMS都不为这种操作提供单一语句语法。

您的语法很可能需要看起来像这样。

INSERT INTO
`pc_tech`.session_route_data (session_volume,country_origin, pu_date)
VALUES ('1','Switzerland','2012-01-01')
ON DUPLICATE KEY UPDATE  `session_volume` = `session_volume`+1;

INSERT INTO
`pc_tech`.session_route_data (session_volume,country_origin, pu_date)
('8','Ireland','2012-01-01') 
ON DUPLICATE KEY UPDATE `session_volume` = `session_volume`+8; 

INSERT INTO
`pc_tech`.session_route_data (session_volume,country_origin, pu_date)
('3','UK','2012-01-01')
ON DUPLICATE KEY UPDATE `session_volume` = `session_volume`+3;

如果您担心并发(如果您希望调度程序从定时和日志记录的角度处理多个语句,如单个语句,则需要使用事务。)