这是我将来在JAVA应用程序中用到的SQL语句.用来往这个表里插入一条记录.
insUnPigeFileStr = "insert into ARCH.Unpigefile (unpigefileid,fileno,wordnum,title,filetypeid,screatlevelid,keeptermid,organid,keyword, makedate,pigedate,roomid, dutyer,orgid,pieceno,shareno,submiter,filetype,state,fileflag,volid,archno,re) values (ARCH.SEQ_Unpigefile.nextval,?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";

解决方案 »

  1.   

    是不是你在插入之前表中已经有数据了,而这些数据的unpigefileid值又不是通过序列产生的,然后插入的时候出现了主键重复了
      

  2.   

    我插入之前,有一些数据是通过JAVA+HIBERNATE插入的.我主要负责导数据这一块是通过SQL实现的.在我通过SQL往里插入之前,表里已经存在了通过HIBERNATE插入的数据.
      

  3.   

    我用我的SQL语句在另一个用户下的同样结构的表中往里插入没有问题。是不是与用户有关系呀。
      

  4.   

    难道不能同时使用HIBERNATE与SQL往库里插入吗?
      

  5.   

    怎么会跟用户有关呢,问题已经很清楚了啊,你的主键值是从序列中产生的,所以必须保证不同地方插入的时候使用的是同一个序列,也就是说用HIBERNATE插入的时候主键值必须也要使用ARCH.SEQ_Unpigefile这个序列产生,满足以上条件后把表数据清空,再执行程序
      

  6.   

    select max(unpigefileid) from Unpigefile;假如是 10000 则:DROP SEQUENCE SEQ_Unpigefile;
    CREATE SEQUENCE SEQ_Unpigefile START WITH 10001 INCREMENT BY 1 MINVALUE 1 NOCYCLE NOCACHE ORDER;注意那个 10001 就是 max(unpigefileid) + 1 这样就不会出错了
      

  7.   

    谢谢热心人,duanzilin(寻) ( ) 信誉:120 
    把表数据清空再执行程序肯定没有问题。可是现在还要保留表中的内容。能不能通过一些SQL语句实现我以后每往里插入一条记录,比如,取出当前序列的值,然后删除当前序列,新建一个序列,将上一序列的值+10做为当前序列的起始位置并返回。
      

  8.   

    我确定hibernate与SQL插入都使用的一个序列。
      

  9.   

    to  boydgmx(梦霄) ( ) 信誉:98 
    谢谢大侠.
    请问怎么实现注意那个 10001 就是 max(unpigefileid) + 1 ,不好意思,我太笨笨了
      

  10.   

    先读出数据表的max(unpigefileid) bb
    bb++
    然后再插入表中
      

  11.   

    我是说你重新定义序列的时候,那个 start with 后面的数值就是 max(unpigefileid) + 1不好意思,我没说明白
      

  12.   

    不知道你明白了没有,再说一下吧:--1.找出表里面现有记录的最大序号
    select max(unpigefileid) from Unpigefile;--2.删除序列
    DROP SEQUENCE SEQ_Unpigefile;--3.重建序列
    CREATE SEQUENCE SEQ_Unpigefile START WITH (这里就是第1步得出的最大序号+1) INCREMENT BY 1 MINVALUE 1 NOCYCLE NOCACHE ORDER;
      

  13.   

    明白了。谢谢各位。
    我看了一些介绍可以使用什么触发器。不知道怎么实现。其实就是在我插入动作之前做 boydgmx所说的事情。不知怎么实现。我只是想多学些东西,望各位大侠赐教.
      

  14.   

    关键问题是楼主插入数据的问题,如果程序里数据插入数据方式不统一,就算用最大序号做为序列起始值也没用,可能过段时间又会存在这样的数据,不会每次都在程序里重建序列吧,可以使用max(unpigefileid)+1来产生新的主键值,但是这样就没必要用序列了,还有用触发器也没必要用序列的
      

  15.   

    谢谢duanzilin(寻) 大哥。
    我是这样做的。因为我不会写触发器。所以在程序,中每次执行插入语句之前,按照boydgmx(梦霄) 大哥说得那样,得到序列最值。删除序列。新建序列并且起始值为前最值+1。然后执行我的插入语句。我感觉执行效率还可以,不是太慢。呵呵。现在贴。谢谢各位参与。