dumplicate mysql 技术_MySQL批量Insert应用ON DUPLICATE KEY UPDATE

也不清楚是设计的问题,还是实现的问题.

总之最后到我这里,是一个很奇怪的需求.

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

76a3391556bf2f70f85df391403a8d34.png

在SQL执行之前的award_credit表数据

538514bb5af7cc13753b187e04bc779d.png

在SQL执行之后的award_credit表数据

538514bb5af7cc13753b187e04bc779d.png

在实验的过程中,有一个优化的想法,既然两个字段都是sum聚合,能不能使用自定义变量计算一次呢,

实际上是行不通的,自定义变量的执行顺序和变量的位置并不是严格固定的.

9aeccbb7ad26af70fed799aceaafad96.png

但是也有变通的方法

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;

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值