mybatis&&mysql中批量插入更新语句

一.背景

最近在做一个项目的重构工作,其中涉及到了一部分数据的清洗和同步工作。在特定的情况下会用到一些特殊的mysql 操作。

二.用法技巧

1.mysql ON DUPLICATE KEY UPDATE

如果你指定了ON DUPLICATE KEY UPDATE,如果在一个UNIQUE索引或PRIMARY KEY中出现重复值,就会执行update之后的操作,否则执行insert操作。

insert into table_name (name, age)values ('xxx', 19);

如果 name为唯一索引且name为'xxx'的记录已经存在,则会报错.

此时为了解决这个问题有三种方案。

(1)忽略

insert ignore into table_name (name, age)values ('xxx', 19);

这条sql会被忽略掉。

(2)完全覆盖

replace ignore into table_name (name, age)values ('xxx',19);

这条语句就相当于先把原来表中的记录删除掉,然后在重新插入。建议在清洗数据的时候使用,因为跑数据可能由于某些不可抗拒的因素中断,此时你就需要接上断点,可能会有重合,避免报错的同时又保证了数据的可靠性。(具体业务具体分析)

(3)更新部分字段

insert into table_name (name, age)values ('xxx', 18) on duplicate key update age = 19.

此条语句只更新了age字段。

2.也可以使用ON DUPLICATE KEY UPDATE实现批量更新

INSERT INTO table_name (name, age) VALUES 

<foreach collection="list" item="persion" index="index" separator=",">

   (#{name}, #{age}1️⃣},

</foreach>

ON DUPLICATE KEY UPDATE 

age = VALUES(age) //此处的age为1️⃣处的age

相对于case when 会更加简介。

3.msql if语句的使用

mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用。

(1)IF(expr1,expr2,expr3)

select if(sva=1,"男","女")as ssva from table_name  where id ='111'

(2)也可以与count连着用

select count(if(if(age>18,true,null))) from table_name;

得出age>18的数量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,840评论 0 11
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx阅读 8,354评论 0 16
  • day60 《闪亮的日子》 仓央嘉措说,那一世,转山转水转佛塔,不为修来生,只为途中与你相见。还没等到你,只有独...
    Molly_zhang阅读 209评论 0 0
  • 暑假办了两个月的健身卡,明天到期,今天是我最后一次练瑜伽。和瑜伽相伴的这两个月,一次又一次地不断挑战自己,重新认识...
    绿水无忧春风拂面阅读 665评论 0 1