mysql插入或更新

mysql 专栏收录该内容
18 篇文章 0 订阅

1. 数据插入或更新,既可以在java业务层进行,也可以在mysql数据库层处理。

2. 业务层一般做法是先查询,如果不存在在插入,如果存在则更新,但是查询和插入不是原子性操作,在并发量比较高的时候,可能两个线程都查询某个记录不存在,所以会执行两次插入,然后其中一条必然会因为主键(这里说的主键不是递增主键)冲突而失败。

而数据库层mysql中 insert ... on duplicate key update 是原子性操作,高效又安全。

3. 但是使用数据库层处理的前提是:on duplicate key update 的 key必须是表的主键或者是由某个或多个字段构成的唯一索引。

4. on duplicate key update 可以更新单个或多个字段:附录

-- 更新单个字段
<insert id="saveOrUpdate">
  	insert into 
  		t_model(user_prod_id,user_id,prod_id,num)
  	values
	  	(
	  		#{userProdId},
	  		#{userId},
	  		#{prodId},
	  		#{num}
	  	)
	on duplicate key update
  	num = num+#{num}
  </insert>


-- 批量插入或更新
<insert id="batchInsert" keyProperty="file">
  	insert into 
  		t_model(union_id,mer_id,file,create_time,goods_name)
  	values
  		<foreach collection="list" separator="," item="item">
  			(
  				#{item.unionId},
  				#{item.merId},
  				#{item.file},
  				#{item.createTime},
  				#{item.goodsName}
  			)
  		</foreach>
  	on duplicate key update file = file
  </insert>


-- 更新多个字段
<insert id="saveOrUpdateStatus">
  	insert into 
  		t_model(order_id,consumer_status,success_status,send_status,create_time)
    values
    	(	
    		#{orderId},
    		#{consumerStatus},
    		#{successStatus},
    		#{sendStatus},
    		#{createTime}
    	)
    on duplicate key update
		success_status = #{successStatus},
		consumer_status = #{consumerStatus},
		update_time = #{updateTime}
  </insert>

5. 批量,同时避免重复插入:

<insert id="moveShopProduct">
		insert into t_model(cloud_shop_product_id, cloud_shop_id, cloud_category_id, cloud_product_square_id)
		<foreach collection="cloudProductSquareIds" item="cloudProductSquareId" separator="union all">
			select md5(uuid()), #{cloudShopId}, #{cloudCategoryId}, #{cloudProductSquareId} FROM DUAL
			where not exists (
				select * from t_modelwhere status = true
				and cloud_shop_id=#{cloudShopId}
				and cloud_category_id=#{cloudCategoryId}
				and cloud_product_square_id=#{cloudProductSquareId}
			)
		</foreach>
	</insert>

 

  • 1
    点赞
  • 0
    评论
  • 6
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

陌下微尘

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值