项目场景:
最近遇到一个问题,插入的时候需要根据插入的数据判断有没有重复的,本来自己想的办法是每次插入的时候查询一下比较出不一样的再插入。具体如下
问题描述
刚开始想到的是在插入数据的时候查询一下:
//从集合中提取一列 查询出所有的数据
List all= personList.stream().map(Person::getName).collect(Collectors.toList());
//需要插入的数据
List port= personList.stream().map(Person::getName).collect(Collectors.toList());
//跟自己获取到的做比较
result = port.stream().filter(item -> all.stream().allMatch(each -> !item.equals(each))).collect(Collectors.toList());
这样就可以取到差值,然后把这个差值存到数据库就可以实现不插入重复数据的效果。
原因分析:
这样写确实是可以实现的,如果是多线程的话还是会出现重复的数据,加锁会影响性能,所以就只能加唯一索引,但是这个前提是目前数据库里面,这个唯一值是没有重复的,有重复的需要先查询表分组去重,然后放到一个新表里面,完了以后加上唯一索引就可以了。
解决方案:
加唯一索引:
>#创建单列唯一索引
>alter table sc add unique (name);
>#创建多列唯一索引
>alter table sc add unique key name_score (name,score);
>#删除唯一索引
>alter table sc drop index name;