开发者

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

目录
  • 一、insert,存在则更新,不存在则新增
    • 1、表结构如下:
    • 2、sql语句 
    • 3、批量插入,某一条记录存在,则更新;其余进行新增
  • 二、insert,存在则不进行任何操作;不存在则新增
    • 1、sql语句
  • 三、总结

    小编最近在项目中,遇到了一个问题,因为并发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)

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

    2、sql语句 

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

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

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

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

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

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

     

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

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

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

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

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

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

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

    @Insert({
            "<script>",
            "insert into weekly_item (weekly_id, androidweekly_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}," +
                    "www.devze.com#{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);

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

    二、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中insert并发问题(on DUPLICATE KEY UPDATE)

    三、总结

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

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

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

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜