Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践

Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践

作者头像
加多
发布于 2018-09-06 07:21:43
发布于 2018-09-06 07:21:43
2.5K00
代码可运行
举报
文章被收录于专栏:Java编程技术Java编程技术
运行总次数:0
代码可运行

一、前言

在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作;

这个操作可以在业务层做,也可以在数据库层面做;

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

数据库层mysql中INSERT ... ON DUPLICATE KEY UPDATE就可以做这个事情,并且是原子性操作,本文就来讲解的使用。

二、INSERT ... ON DUPLICATE KEY UPDATE命令

2.1单条记录下使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

如上sql假如t1表的主键或者UNIQUE 索引是a,那么当执行上面sql时候,如果数据库里面已经存在a=1的记录则更新这条记录的c字段的值为原来值+1,然后返回值为2。如果不存在则插入a=1,b=2,c=3到数据库,然后返回值为1。

2.2多记录下使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(c);

三、MyBatis下使用

Mybatis作为经典的数据库持久层框架,自然要介绍下它下的使用

  • 在mapper.xml里面配置如下: 假设a为主键
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<insert id="insertOrUpdate">
        INSERT INTO t1 (a,b,c) 
        values
        <foreach collection="list" item="item"  separator=",">
            (#{item.a},#{item.b},#{item.c})
        </foreach>
        ON DUPLICATE KEY UPDATE c=values(c),b=values(b)
 </insert>
  • 对应的mapper接口可以定义为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long insertOrUpdate(List<Test> list);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Test{
private int a;
private int b;
private int c;
...
}

注:mysql中sql字符串大小有限制,我本机的mysql上执行show VARIABLES like '%max_allowed_packet%';结果为max_allowed_packet为4M:

image.png

四、参考

https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mysql中的INSERT ... ON DUPLICATE KEY UPDATE
在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作;
美团骑手
2021/12/24
1.9K0
INSERT ... ON DUPLICATE KEY UPDATE
该文介绍了MySQL中INSERT ... ON DUPLICATE KEY UPDATE语句的用法,该语句用于在表中插入新行,并在特定条件下更新现有行。
高爽
2017/12/28
1.8K0
MySQL实战中,Insert语句的使用心得总结
小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里
陈哈哈
2021/10/13
1.6K0
INSERT ... ON DUPLICATE KEY UPDATE Statement
此时我们可以使用INSERT ... ON DUPLICATE KEY UPDATE语句
阿超
2022/08/21
8390
INSERT ... ON DUPLICATE KEY UPDATE Statement
Mysql on duplicate key update用法及优缺点
在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新,
全栈程序员站长
2022/07/19
3.3K0
Mysql on duplicate key update用法及优缺点
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day17】—— 数据库4
  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。
陈哈哈
2021/12/31
1.2K0
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day17】—— 数据库4
Mysql INSERT ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE KEY UPDATE是MySQL insert的一种扩展。当发现有重复的唯一索引(unique key)或者主键(primary key)的时候,会进行更新操作;如果没有,那么执行插入操作。
霸王猪
2018/07/19
5K0
Mysql INSERT ON DUPLICATE KEY UPDATE
MySQL的ON DUPLICATE KEY UPDATE用法 增量更新
平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件.
kirin
2021/04/09
7K0
MySQL的ON DUPLICATE KEY UPDATE用法 增量更新
讲讲insert on duplicate key update 的死锁坑
最近有一些活动,于是会对系统做一些平时量比较小的路径做一些打压,这不打压还好,这一打压就出现了奇怪的问题,居然有一段陈年老代码出现了死锁的问题,日志如下:
用户5397975
2020/04/07
22.6K4
mysql DUPLICATE KEY UPDATE 问题
DUPLICATE KEY UPDATE batch执行时出死锁错误 背景知识 一、 mysql  insert 与 duplicate key: 典型的插入语句: 多条:INSERT INTO tablename (columnA, columnB, columnC) VALUES ('a', 1, 2), ('b', 7, 5) 单条:INSERT INTO tablename SET columnA='a', columnB=1, columnC=2 复制:INSERT [options1] [INT
架构师刀哥
2018/03/20
3.6K0
insert ... on duplicate key update 和 replace into
前段时间和滴滴的一位同学聊到 insert ... on duplicate key update 插入一条记录成功后,影响行数为 2 意味着什么?
csch
2022/09/05
1.8K0
insert ... on duplicate key update 和 replace into
mysql insert duplicate key update 死锁分析
数据入库这块有离线和实时两套入库系统,写同一个db的同一批mysql表,两边用的都是insert into table on duplicate key update这种方式。实时一直运行,离线5分钟更新一次,当两套系统同时运行时出现了死锁问题,频率还挺高。事务的隔离级别是read committed 读提交。
YG
2021/03/04
4.4K1
insert...on duplicate key update语法
这样的操作乍一看没有什么问题,但是仔细分析分析,还是有些瓶颈的,目前来看,我能分析到的瓶颈有两个,
AsiaYe
2019/11/06
2.6K0
MYSQL冷知识——ON DUPLICATE KEY 批量增删改
所以就是实现批量混合增改,然而组长说mysql不支持混合增改,代码上要一个一个操作很耗性能,打算拒了这需求
ydymz
2019/03/15
2K0
IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践
在实际业务场景中,经常会有这样的需求:插入一条记录,如果数据表中已经存在该条记录则更新它的部分字段,比如更新update_time或者在某些列上执行累加操作等。参考博客1中介绍了三种在MySQL中避免重复插入记录的方法,本文将在简单介绍这三种用法的基础上,深入分析这其各自存在的问题,最后给出在实际生产环境中对该业务场景的最佳实践。
saintyyu
2021/11/22
2.5K1
IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践
mysql批量写入_mysql insert多条数据
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?
全栈程序员站长
2022/11/08
6.7K0
mysql批量写入_mysql insert多条数据
Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程
遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对大家有帮助。
捡田螺的小男孩
2020/04/15
2.3K0
Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程
MySQL中insertOrUpdate的功能如何实现的
insertOrUpdate 在我们日常使用中比较常见,那么它是如何实现的呢,不知道大家有没有考虑过呢?
@派大星
2024/06/08
6910
MySQL中insertOrUpdate的功能如何实现的
MySQL INSERT INTO...ON DUPLICATE KEY UPDATE的使用
1. 语法规则为: INSERT [INTO] tbl_name [(col_name,...)] {VALUES} ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ] 2. 在UPDATE字句中可以使用VALUES(col_name)函数来引用INSERT字句中的VALUES值; 比如: INSERT INTO
囚兔
2018/02/08
9230
PostGreSQL ON DUPLICATE KEY UPDATE
在关系数据库中,术语 upsert 被称为合并(merge)。意思是,当执行 INSERT 操作时,如果数据表中不存在对应的记录,PostgreSQL 执行插入操作;如果数据表中存在对应的记录,则执行更新操作。这就是为什么将其称为 upsert(update or insert)的原因。
小石头
2023/03/24
4.5K0
推荐阅读
相关推荐
Mysql中的INSERT ... ON DUPLICATE KEY UPDATE
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验