一.背景
最近在做一个项目的重构工作,其中涉及到了一部分数据的清洗和同步工作。在特定的情况下会用到一些特殊的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的数量。