mysql on duplicate key 新增和更新的使用

mysql on duplicate key 新增和更新的使用

mybatis 写法

新增或修改更新一条数据

insert into nft_nftgoal_user_goods (user_id,good_id,number) 
values(#{po.userId},#{po.goodId},#{po.number}) 
on duplicate key 
update user_id=#{po.userId},good_id=#{po.goodId},number=number+#{po.number}

新增或修改更新带有条件的一条数据

insert into nft_nftgoal_auxiliary_user_physical_power (card_id,physical_power_value) 
values (#{cardId},100-#{reducePower})
on duplicate key 
update card_id=#{cardId},physical_power_value=
	case when physical_power_value-#{reducePower} <![CDATA[ <= ]]> 1 then 1 
		else physical_power_value-#{reducePower} end

新增或修改更新带有条件的多条数据,请注意 update = VALUES,多条语句的话,必须这样写

insert into nft_nftgoal_auxiliary_user_physical_power (card_id,physical_power_value) 
values (#{cardId},100-#{reducePower}),(#{cardId},100-#{reducePower}),(#{cardId},100-#{reducePower}),(#{cardId},100-#{reducePower})
on duplicate key 
update card_id=VALUES(card_id),physical_power_value=
	case when physical_power_value-#{reducePower} <![CDATA[ <= ]]> 1 then 1 
		else physical_power_value-#{reducePower} end

更新带有条件的数据

update nft_nftgoal_auxiliary_user_physical_power 
			set physical_power_value = 
				case when physical_power_value + #{addPower} <![CDATA[ >= ]]> 100 then 100 else physical_power_value + #{addPower} end
		where physical_power_value <![CDATA[ < ]]> 100 and update_time <![CDATA[ < ]]> DATE_ADD(now(),INTERVAL -1 HOUR)

警告:on duplicate key update 需要存在主键或者唯一键,但这种写法会出现死锁问题,请注意
若要避免死锁,则需要在java代码中进行控制
这种写法的好处就是减少数据库的交互,不用去查询数据是否存在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值