我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql中insert并发问题(on DUPLICATE KEY UPDATE)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql中insert并发问题(on DUPLICATE KEY UPDATE)

小编最近在项目中,遇到了一个问题,因为并发insert造成了脏数据,主要场景是:

  • 根据查询数据库的结果:存在,则进行更新;不存在,则进行新增;
  • 还有一个场景需求:若已存在,则仅查询;不存在,则进行新增;

百度发现,mysql已经为我们提供了相应的sql语句去实现这些场景。

一、insert,存在则更新,不存在则新增

语法:on DUPLICATE KEY UPDATE

1、表结构如下:

CREATE TABLE `testMfc` (                                   
           `id` int(11) NOT NULL AUTO_INCREMENT,                    
           `age` int(11) DEFAULT NULL,                              
           `name` varchar(20) DEFAULT NULL,                         
           `num` int(11) DEFAULT NULL,                              
           PRIMARY KEY (`id`),                                      
           UNIQUE KEY `uk_01` (`age`,`name`)                        
         ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4  

注意:想要使用该语法,必须利用“唯一索引”或者“主键索引”,只有产生“索引冲突”,该语法才能正常生效。

此处建立唯一索引:age列和name列

插入初始数据:

insert into testMfc values (null, 1,'1',30),(null,2,'2',40)

2、sql语句 

已存在,则更新:(影响行数为:2,如果使用mybatis,返回值 int =2,同时该语句可返回当前 主键)

 insert into testMfc values (null, 1,'1',30) on duplicate key update num = 1;

 不存在,则新增:(影响行数为:1,如果使用mybatis,返回值 int =1,同时该语句可返回当前 主键)

insert into testMfc values (null, 3,'3',50) on duplicate key update num = 1;

 

3、批量插入,某一条记录存在,则更新;其余进行新增

insert into testMfc values 
(null, 3,'3',300), 
(null, 4,'4',400),
(null, 5,'5',500),
(null, 2,'2',200)
on duplicate key update num = values(num);

更新:age = 2 和 age =3 的num属性,新增age = 4 和 5 的数据

注意: num = values(num) ,此处的格式,必须是 values(列名),才能更新到对应的行。

mybatis语法:(与该表无关,则用作语法参考)

@Insert({
        "<script>",
        "insert into weekly_item (weekly_id, weekly_task_name," +
                "task_id, plan, project_id,duty_user_key, status, copy_status," +
                "create_at, update_at, comment_id,complete)" +
                "<foreach collection='insertList' item='item' open='values '  separator=','> " +
                "(#{item.weeklyId,jdbcType=INTEGER}," +
                "#{item.weeklyTaskName,jdbcType=VARCHAR}," +
                "#{item.taskId,jdbcType=INTEGER}," +
                "#{item.plan,jdbcType=VARCHAR}," +
                "#{item.projectId,jdbcType=INTEGER}," +
                "#{item.dutyUserKey,jdbcType=VARCHAR}," +
                "#{item.status,jdbcType=TINYINT}," +
                "#{item.copyStatus,jdbcType=TINYINT}," +
                "now()," +
                "now()," +
                "#{item.commentId,jdbcType=INTEGER}," +
                "#{item.complete,jdbcType=VARCHAR})" +
                "</foreach>"+
                "ON DUPLICATE KEY UPDATE " +
                "complete = VALUES(complete)",
        "</script>"
})
void insertBatchOrUpdate(@Param("insertList") List<WeeklyItem> copyItemList);

二、insert,存在则不进行任何操作;不存在则新增

语法:insert ignore into 表名

1、sql语句

注意:

  • 已存在:(影响行数为:0,如果使用mybatis,返回值 int =0,该语句不能 返回当前 主键)
  • 不存在则新增:(影响行数为:1,如果使用mybatis,返回值 int =1,该语句 可以 返回当前 主键)
 insert ignore into testMfc values (null,1,'1',123);

三、总结

mysql还提供了其他原子性操作,比如说:insert,若已存在,则先删除再新增,个人觉得可以使用存在则更新操作代替,所以此处就不做介绍,希望对你们有用。

备注: 网上有人提问,on DUPLICATE KEY UPDATE 在mysql客户端可以正常使用,但是在mybatis就没有效果,既不更新也不新增,同时语句还不报错。小编刚也遇到了“类似情况”,后来发现是参数传错了,粗心了呀。还有一个是sql语句insert的时候,将id也赋值了,这个时候就是主键冲突了。可能不是我们想要的自定义“唯一索引”

 到此这篇关于mysql中insert并发问题(on DUPLICATE KEY UPDATE)的文章就介绍到这了,更多相关mysql insert并发内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql中insert并发问题(on DUPLICATE KEY UPDATE)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql中insert并发问题(on DUPLICATE KEY UPDATE)

目录一、insert,存在则更新,不存在则新增1、表结构如下:2、sql语句 3、批量插入,某一条记录存在,则更新;其余进行新增二、insert,存在则不进行任何操作;不存在则新增1、sql语句三、总结小编最近在项目中,遇到了一个问题,因为
2023-01-09

mysql中insert并发问题(on DUPLICATE KEY UPDATE)

本文主要介绍了mysql中insert并发问题(on DUPLICATE KEY UPDATE),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-09

MySQL中ON DUPLICATE key update的使用

目录一、主键索引、唯一索引和普通索引的关系二、实战操作1.ON DUPLICATE key update使用介绍:2.ON D编程客栈UPLICATE key update测试样例:三、总结一、主键索引、唯一索引和普通索引的关系主键索引:
2023-05-25

mysql特殊语法insert into .. on duplicate key update ..使用详解

文章目录 一、前言二、insert into … on duplicate key update ...1、处理逻辑2、示例:表结构1> 不存在记录,插入的情况2> 存在记录,可以更新字段的情况3> 存在记录,不可以更新字段的情况4
2023-08-17

MySQL中ON DUPLICATE KEY UPDATE语句的使用

目录前言一、语法与功能二、使用场景三、注意事项四、实例分析前言在mysql数据库中,INSERT INTO ... ON DUPLICATE KEY UPDATE 是一个强大的SQL语句,它结合了插入新记录和更新已存在记录的功能于一体。这
MySQL中ON DUPLICATE KEY UPDATE语句的使用
2024-08-21

mysql特殊语法insert into .. on duplicate key update ..使用方法详析

在我们的日常开发中经常会遇到过这样的情景,查看某条记录是否存在,不存在的话创建一条新记录,存在的话更新某些字段,下面这篇文章主要给大家介绍了关于mysql特殊语法insert into .. on duplicate key update ..使用方法的相关资料,需要的朋友可以参考下
2023-05-15

mysql特殊语法insert into .. on duplicate key update ..使用方法详析

目录一、前言二、i编程客栈nsert into … on duplicate key update …1、处理逻辑2、示例:3、Update子句获取inset部分的值4、last_ins编程ert_id()总结一
2023-04-12

MybatisPlus 使用 saveOrUpdate 详解(慎用),及问题解决方法&mysql保存或更新 ON DUPLICATE KEY UPDATE

今天的想法是,要在插入数据库时,如果有某某一个主要字段的值重复,则不插入,否则则插入! 看了一下mybatis-Plus是有这个saveOrUpdate 方法! 原本使用save时是没有问题了,改成saveOrUpdate 用了一下就报错了
2023-08-23

MySQL中SELECT+UPDATE处理并发更新问题解决方案

这篇文章主要介绍了MySQL中SELECT+UPDATE处理并发更新问题解决方案分享,需要的朋友可以参考下。 问题背景 假设MySQL数据库有一张会员表vip_member(InnoDB表),结构如下:当一个会员想续买会员(只能续买1个月、
2022-05-16

编程热搜

目录