现在情况是这样的,我们医院有四个药房,西药房现在前台卖药出单(剩下三个药房没事,而且这4个药房的记录都存在一个表中),记录无法入库~!报的错误是ORA 00001
违反了主键的唯一约束,主键在RECORD_ID这个字段上,前台下单,应该是往这张表中写入一个insert操作(这个insert语句怎么也抓不到),在record_ID这个字段上用序列插入,我怀疑是不是这个序列出了问题?还是什么别的问题?哪位高手能解答一下?在下先谢过~~很急,西药房那边整个瘫痪了。。唯一约束,序列

解决方案 »

  1.   

    如果主键就是这个record_id的话,那就是这个序列的问题。
      

  2.   

    我这个表所在的用户下有3个序列,我不能确定用的那个序列先在,而且insert的sql抓不到~~
      

  3.   

    谢谢~~能说下调整序列的语法吗?就是怎么把序列值变大? select 序列名.nextval from dual;这样行吗?
      

  4.   


    取一个当前的seq的值看是否已经存在于表中
    select seq.nextval from dual;
    如果已经存在,找到已经存在的最大的seq值比如maxSeq
    然后用maxseq - seq.nextval  找到相差的数目,比如两个相差100然后
    declare
      n_loop number(10);
    begin
      for i in 0..100 loop
        select seq.nextval into n_loop from dual;
      end loop;
    end
    目的是让下一个seq不会再产生冲突另外,你需要检查是什么导致了这个问题的产生,是因为缓冲池被重置或者是什么其他的原因.
      

  5.   


    取一个当前的seq的值看是否已经存在于表中
    select seq.nextval from dual;
    如果已经存在,找到已经存在的最大的seq值比如maxSeq
    然后用maxseq - seq.nextval  找到相差的数目,比如两个相差100然后
    declare
      n_loop number(10);
    begin
      for i in 0..100 loop
        select seq.nextval into n_loop from dual;
      end loop;
    end
    目的是让下一个seq不会再产生冲突另外,你需要检查是什么导致了这个问题的产生,是因为缓冲池被重置或者是什么其他的原因.问题是我现在不能确定它用的是哪个序列查去的....我从V$sqlarea 里抓不出来哪个插入的sql,所以确定不了是用的哪个sequence,怎么办
      

  6.   


    取一个当前的seq的值看是否已经存在于表中
    select seq.nextval from dual;
    如果已经存在,找到已经存在的最大的seq值比如maxSeq
    然后用maxseq - seq.nextval  找到相差的数目,比如两个相差100然后
    declare
      n_loop number(10);
    begin
      for i in 0..100 loop
        select seq.nextval into n_loop from dual;
      end loop;
    end
    目的是让下一个seq不会再产生冲突另外,你需要检查是什么导致了这个问题的产生,是因为缓冲池被重置或者是什么其他的原因.问题是我现在不能确定它用的是哪个序列查去的....我从V$sqlarea 里抓不出来哪个插入的sql,所以确定不了是用的哪个sequence,怎么办不能确定它用的哪个序列? 这个...不科学.
    也可能不是seq 可能是 max(id)+1
      

  7.   

    直接用select max(id) from table,将3张表的最大id号查出来,在看看3个表的sequence到了多少,大于当前的sequence值说明这个表就有问题,要么写代码的时候插入数据引用错误的sequence,要么就是直接改这个表的sequence。
      

  8.   

    解决了,我把所有的主键列的值都update了一下,然后就能插进去了,发现就是序列的问题,下一个序列取得值是2917(这个值表里已经有了),插一个跳到了2918,然后再update回来~~搞定,结贴~!!
      

  9.   

    一 通过查看record_ID的最大值和三个序列号的当前值来确定是用哪个序列号的
    二 为什么要用到三个序列号呢?一个不行吗?我感觉设计的有点问题
    三 我推测,问题应该是这样的。
    序列一是从100开始,每次递增1;序列二是从1000开始的,每次递增1。
    这样在调用序列一的前899次时,过程是不会报错的。但当你第900次调用序列一时,你要通过序列号一往主键record_ID上插入1000.而1000已经被序列号二插入了,所以就报错了。
    真对你的需求,我真的是建议只用一个序列号。