场景:
对一个小表数据进行Excel导入时候,因为只建立了主键,也不好建立索引导致回表的产生,同时需要对多个字段判断(不只有主键)是否重复了,重复则新增,不存在则插入。
解决方法:
可以用多字段拼接算其一个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(...),(...)
这样一次导入的数据就不必每行数据都需要查询判断一次。
后续:
MD5对小表数据处理还是能够接受,不怕碰撞,如果还是担心的话可以SHA1 MD5 加表盐混用做ID,然后增加一个数据复核的流程,除了主键外,再进行内容匹配。
|