MySQL批量Insert應用ON DUPLICATE KEY UPDATE

壹頁書發表於2015-04-29
也不清楚是設計的問題,還是實現的問題.
總之最後到我這裡,是一個很奇怪的需求.

award_credit_room這個表,存放使用者送禮的記錄
award_credit 是使用者送禮產生的積分記錄

award_credit_room的資料經過彙總之後,需要批量Insert到award_credit表,
如果沒有記錄,則Insert,存在記錄則Update

使用MySQL自定義變數,實現 insert..select...ON DUPLICATE KEY UPDATE

該功能使用如下SQL

set @a:=0;
set @b:=0;
insert into award_credit ( credits, vvid, CreditsTotal )
select @a:=sum(CreditChange) ,VVID,sum(CreditChange)  
from award_credit_room r
where awardActId = 23 and Status = 2 group by VVID
ON DUPLICATE KEY UPDATE credits = credits + @a, creditsTotal = creditsTotal +@a;

在執行之前的彙總查詢結果
select @a:=sum(CreditChange) ,VVID,sum(CreditChange)  
from award_credit_room r 
where awardActId = 23 and Status = 2 group by VVID


在SQL執行之前的award_credit表資料


在SQL執行之後的award_credit表資料



在實驗的過程中,有一個優化的想法,既然兩個欄位都是sum聚合,能不能使用自定義變數計算一次呢,
實際上是行不通的,自定義變數的執行順序和變數的位置並不是嚴格固定的.


但是也有變通的方法
set @a:=0;
insert into award_credit ( credits, vvid, CreditsTotal )
select @a:=s,vvid,s from
(
    select sum(CreditChange) s,VVID  from award_credit_room r where awardActId = 23 and Status = 2 group by VVID
) t1
ON DUPLICATE KEY UPDATE credits = credits + @a, creditsTotal = creditsTotal +@a;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1610013/,如需轉載,請註明出處,否則將追究法律責任。

相關文章