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的数量。

    原文作者:y三小石
    原文地址: https://www.jianshu.com/p/2955ed22b4c0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞