MySQL实现如果存在就更新,不存在就写入
最近的业务中,有这样一个需求:如果数据存在就更新,不存在就写入,一般情况下是需要先查询,后判断是更新还是写入的,需要进行两次IO操作。所以为了减少同步时间,第一个思路是使用并发,第二种思路就是应该尽量减少请求MySQL的次数,这里将讲讲第二种思路。
正常情况下实现:如果存在就更新,不存在就写入的伪代码:
// 伪代码
user=User.FindById(1)
if user == null{
user.Insert()
}else{
user.Update()
}
需要先查询,然后在通过if / else来进行插入或更新,所以总共需要进行两次数据库IO。
所以为了减少数据库IO,可以使用如下方法:
1、replace into
replace into的作用是:如果数据已经存在了我就更新。如果数据不存在就更写入。
而判断数据是否已经存在的标准依然是:判断唯一键是否重复。
Step1:这是用于做实验的表数据
Step2:使用replace into插入一条主键已存在的数据:
可以看到replace into在这里的作用是已存在则更新。
Step3:使用replace into插入一条主键不存在的数据:
可以看到,replace into在这里的作用是不存在则写入。
所以replace into是完全可以满足我们的需求的。
2、on duplicate key update
这种方法也是可以实现如果存在就更新,不存在就写入的需求,如下:
但是使用这个方法会有点缺陷:
官网中有描述:如果你每次使用on duplicate key update进行更新时(注意是更新而不是插入),MySQL也会让last_insert_id变大。这就会出现id不连续增长的现象。
所以如果对主键的连续性有要求的话,推荐使用第一种方法。
–我是“道祖且长”,一个在互联网"苟且偷生"的Java程序员
“有任何问题,可评论,我看到就会回复”
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏