2013-03-21 69 views
0

我想实现类似于这个例子多个插入与在重复键更新

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 

修改改变插入的值符合以下

+0

你是哪个键?我假设'Country_origin'? – gbtimmon 2013-03-21 15:14:18

+0

为什么当您尝试插入session_volume 8时,会将会话音量增加5倍到重复行上?我不遵循那个部分... – gbtimmon 2013-03-21 15:15:52

+0

重复的键是country_origin和日期的组合。我只想在特定日期为每个国家提供一个条目。由于会话数据来自不同的来源,因此我在增加它之后增加了它。 – 2013-03-21 15:20:06

回答

1

重复的值按音符你需要每UPSERT做一个声明。对于RDBMS来说,安排连续的upserts是没有意义的,就像它为了安排连续的插入一样。在连续插入的例子中,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; 

如果您担心并发(如果您想要调度程序处理多个语句就像从时间和记录点的一个单独的语句,你需要使用事务。)