场景:
有个需求,要将Excel编写的手工数据导入Mysql,而Mysql的表格是一张小表,如果我表格只想建立主键,不想建立索引导致回表的产生,同时又需要对多个字段判断(不只有主键)是否重复了,重复则Update,不存在则Insert。
解决方法:
可以用多字段拼接算其一个MD5值当作主键,在插入时候使用 Replace Into 即可完成对数据量少的小表完成重复则更新,新增则插入的功能。
大概做法:
实体类
class ExcelDaily {
private String Id;
// 入库要根据这三字段去重
private String day;
private String editor;
private String office;
.....
}
MD5处理主键
public static String MD5Id() {
ExcelDaily daily = new ExcelDaily;
// 一堆 setter
// 将维度放进去
String MD5Id = MD5Util.MD5Lowercase(daily.getDay() + daily.getEditor() + daily.getOffice());
daily.setId(MD5Id);
......
}
然后可以直接使用 Replace Into
replace into into excel_daily(...) values(...),(...)
这样一次性导入Excel的数据就不必每行数据都需要访问数据库查询判断一次。
后续:
MD5的方法只是对简单环境的小表数据处理,不怕碰撞,如果还是担心的话可以SHA1 MD5 加表盐混用做ID,然后增加一个数据复核的流程,除了主键外,再进行内容匹配。