2013-03-21 37 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; 

如果您擔心併發(如果您想要調度程序處理多個語句就像從時間和記錄點的一個單獨的語句,你需要使用事務。)