Code Bye

java如何判断是否插入重复数据(唯一约束),使用异常还是先查一遍如果不存在再插入?

  一直没解决这个问题,想请教一下各路大神。
   我现在要将excel中的多条学生信息导入数据库,学号为唯一约束,只要一个学生信息已经在数据库中了,就反馈给客户端导入失败,我是应该插入每条数据之前查一下呢,还是用异常判断呢?小弟新人,请各路大神不吝赐教。

插入前判断是否存在!

10分
从技术上讲两种方法是都可以达到目的(抛出违反唯一性约束所以知道已经有了),但是从编程优化角度讲一定是先判断是不是存在然后再插入!
引用 1 楼 huxiweng 的回复:

插入前判断是否存在!

会不会影响效率,比如数据库或execl中已经有10万条数据。每一条遍历,这性能。。。。

我也觉得先查询判断后插入如果数据太多的话肯定影响效率,但异常处理的话,我感觉不太合理,更何况违反唯一约束的异常如何捕获?
select count(id) from student where id=?1;
此结果作为判断条件,这样查询应该也可以优化下。
直接插入  异常也continue  最后commit
引用 5 楼 lp1137917045 的回复:

我也觉得先查询判断后插入如果数据太多的话肯定影响效率,但异常处理的话,我感觉不太合理,更何况违反唯一约束的异常如何捕获?

引用 6 楼 yoxibaga 的回复:

select count(id) from student where id=?1;
此结果作为判断条件,这样查询应该也可以优化下。

很好的回答了 把id加索引


10分
具体采用哪种方案,首先要估计一下你的数据中出现主键重复的可能性有多大。
如果主键重复的可能性很小,那么就采用直接插入,捕获异常的做法。
如果主键重复的可能性很大,那么就先检查主键是否存在,然后再插入的做法。
先查 在插入吧  数据多影响性能,这是常情啊 
引用 3 楼 u012691501 的回复:

从技术上讲两种方法是都可以达到目的(抛出违反唯一性约束所以知道已经有了),但是从编程优化角度讲一定是先判断是不是存在然后再插入!

同意

  用异常捕获! 是抛出什么异常?
看数量量和出现重复的几率。查数据库–两个数据比对,这中间耗时最大的应该是查数据库,因为需要去拿数据库连接,重复不听的geConnection很耗时。另一种如果数据库并发操作不高的话,可以将数据一次性全取出来,用map装起来,然后利用程序从excel中读到的数据进行对比,如果成功则一批批的插入数据库。
引用 8 楼 songbgi 的回复:
Quote: 引用 5 楼 lp1137917045 的回复:

我也觉得先查询判断后插入如果数据太多的话肯定影响效率,但异常处理的话,我感觉不太合理,更何况违反唯一约束的异常如何捕获?

引用 6 楼 yoxibaga 的回复:

select count(id) from student where id=?1;
此结果作为判断条件,这样查询应该也可以优化下。

很好的回答了 把id加索引

大家好  我想问下 select count(id) from student where id=?1   where id = ?1 是什么意思 ?

在sql里面 比在代码里面判断 方便 快速。。执行一次sql就好了。比如: 
IF not EXISTS  (select * from a where item_id=@itemId and person_id=@personId) 
                                         insert into a values(@itemId, @personId, getDate())

20分
出现异常调用的资源更加多,当然如果异常出现少的话,相比每一个插入都要查询一下来说资源就少了。不过一般都不用唯一性约束异常来做吧,异常多了数据库错误的几率会更加大吧。如果能够保证新插入的数据,不管重复或不重复都是正确的数据,直接先delete然后insert。

20分
看需求,你只是为了返回给客户端提示导入失败,所以考虑使用异常捕获就可以了,而且简单、靠谱,并发都不用考虑。还有根本不需要区分具体是抛得什么异常,只要是exception就说明程序报错了,那肯定是失败了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java如何判断是否插入重复数据(唯一约束),使用异常还是先查一遍如果不存在再插入?