我想要实现的与此示例类似
然而,我的不同之处在于我试图同时进行多次插入。我正在更新很多行。
我希望插入增加会话数量,如果它是重复的
以下(精简版)会导致语法错误,但它应该解释我想要实现的目标
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
已修改更改了插入的值,以便根据下面的注释
匹配重复值答案 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;
如果您担心并发(如果您希望调度程序从定时和日志记录的角度处理多个语句,如单个语句,则需要使用事务。)