- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
最近因为家里一些事情,一些变故断更好几天; 后面坚持拿到这个月奖励
本文来自本人之前写的:blog.csdn.net/pmdream/art…
内容
因为在定时任务里面,把mysql的一个表当做缓存来用;
所以就需要update + insert的操作;
如果不需要主键还好,但是因为公司要求最好是有主键的(自增id)
当然用自增id也是有很多好处的(1.方便范围查询 2. 相同范围的数据,大概率会分配在一个数据页上面 3. 减少页分裂的次数 4. 数字型,容易排序,而且占得空间小 5.在数据同步的场景中,自增id的好处比较突出,可以很好地使用waterdrop 进行分片等)
现象呢:
当然,这边有个bug,导致我某些记录频繁的进行更新;
所以就成这样子了;
所以解决方式是 先更新,看看影响的行数,如果大于等于1,那么更新成功,否则就进行插入操作;
之前写法:
<insert id="upsert" parameterType="java.util.List">
insert into xxx_status_desc (
project_id, type, status, status_desc,is_deleted, update_time
)
values
<foreach collection="list" item="item" separator=",">
(#{projectId},#{type},#{item.status},#{item.statusDesc}, 0, NOW())
</foreach>
ON DUPLICATE KEY UPDATE
status_desc = VALUES(status_desc),
is_deleted = VALUES(is_deleted)
</insert>
那么接下来就分解为 update 和insert~ 代码不过多赘述;