我写了个java程序,用的数据库是java自带的java db,即apache derby,这个嵌入式的数据库,功能完全可以。
我的程序是这样的,向数据表的一列中插入值,但是要求这个列的值是唯一的,所以建立表时写了unique这个关键词。
现在比如要向这一列中插入一个值A,但是不知道这个值是不是已经存在于表中了,现在有两种做法:
1,先查询这一列中是否已经存在值A,若有则不插入,若没有则插入
2,直接执行插入,如果出现插入失败(违反惟一性约束)则表示表中已经有这个值了,如果没有异常则插入成功。我想让程序在数据库操作上不要浪费太多的CPU时间,我觉得用第2中方法效率更高(因为第一种得先查询再确定是否更新,而第二种只需执行一个更新,但是却可能抛出异常)。但是在数据库手册上说,如果频繁出现异常的话会比较影响数据库的效率,现在我又想用第一种方法。
我想请问有经验的朋友告诉我,到底用哪种方法效率更高?如有原因则更加感谢。

解决方案 »

  1.   

    merge这种在这个数据库里面有么?
      

  2.   

    你的方法 1 和 2 都不可取 我给你提供第三套方案 1 查询数据库全部数据(当然如果数据超过1万条的话 可以用条件 约束),放到 hashMap中 然后 用代码比对你要插入的数据 筛选出 剩余的 唯一的部署数据 然后批量插入就可以了.这样 即判断了唯一约束 也解决了对数据库 多次操作的效率问题 同时也不会有异常抛出.
      

  3.   


    是oracle数据库,这个可以解决!
      

  4.   

    建议使用第一种。原因:
    1、假如已经存在记录,在JAVA程序中,应该还有后续的异常操作处理(例如返回插入结果失败的提示语)。如果采用第二种,异常抛出后,批量插入是否要继续?如果继续,JAVA程序的逻辑处理就比较困难了。
    2、一般的程序,在查询出已有记录的情况下,可能会执行另外的操作(例如执行UPDATE语句或者跳过),采用第一种方法处理比较好。
    3、类似的查询是否存在记录,对于效率来说,影响不会很大的。
      

  5.   

    #8 的方法是不可以的。你在建表的时候有使用UNIQUE关键字,这个列就已经建立了一个惟一索引,在这种情况下,查询是否存在是非常迅速的,不需要考虑效率问题。