MySQL中INSERT INTO ... ON DUPLICATE KEY UPDATE浅析
最近在做一个阅读次数的需求的时候,有这样一个场景,如果数据库中没有数据,就进行INSERT操作,有数据的话,阅读次数就+1。此处有两种实现方式,一种是想将数据查出来,在Java中进行处理,没有就INSERT,有就+1再UPDATE,这种方式需注意并发操作,并发情况下可能会导致次数少加;另一种就是在数据库层面处理,我们使用的是MySQL,正好MySQL有个语法可以实现这个需求,INSERT INTO ... ON DUPLICATE KEY UPDATE语法。下面我们来浅浅分析下此语法。
INSERT INTO ... ON DUPLICATE KEY UPDATE语法,如果数据库没有数据,就会新增一条数据,如果有数据,就会根据唯一键进行更新对应的值。实现上述需求就可以使用如下SQL:
INSERT INTO t_read (id, article_id, read_count) values (1, 2, 1) ON DUPLICATE KEY UPDATE read_count = read_count + 1;
这里 t_read 表,只是一个示例,id是主键,article_id是唯一键,表中没有数据的话,就会新增一条数据,read_count为1,如果有数据的话,在原read_count上+1赋值给read_count,通过唯一键更新,这样就达到我们的目的啦。可以建一个 t_read 表,将SQL拷贝执行一下,查看数据,就能看到效果啦。如果使用MyBatis的话,在UPDATE之后可以使用 if 标签,进行不同情况下不同值的赋值更新。
MySQL根据该语法执行的操作返回受影响的行数:
若插入新行,则受影响的rows为 1。
若更新现有行,则受影响的rows为 2。
若使用其当前值更新现有行,则受影响的rows为 0。
需要注意,id是自增的话,会导致id自增很快,加上数据量大或者操作频繁的话,可能会导致id溢出。每一次执行,id都会默默增加,这样也会导致自增id不连续。
如图,是我执行了多次上述SQL之后,再新增的数据,id自增就不是连续的了。
大家可以执行一下,看看自增id的影响情况。
行万里路,读万遍经。-- 烟沙九洲
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体