现在情况是这样的,我们医院有四个药房,西药房现在前台卖药出单(剩下三个药房没事,而且这4个药房的记录都存在一个表中),记录无法入库~!报的错误是ORA 00001
违反了主键的唯一约束,主键在RECORD_ID这个字段上,前台下单,应该是往这张表中写入一个insert操作(这个insert语句怎么也抓不到),在record_ID这个字段上用序列插入,我怀疑是不是这个序列出了问题?还是什么别的问题?哪位高手能解答一下?在下先谢过~~很急,西药房那边整个瘫痪了。。唯一约束,序列
违反了主键的唯一约束,主键在RECORD_ID这个字段上,前台下单,应该是往这张表中写入一个insert操作(这个insert语句怎么也抓不到),在record_ID这个字段上用序列插入,我怀疑是不是这个序列出了问题?还是什么别的问题?哪位高手能解答一下?在下先谢过~~很急,西药房那边整个瘫痪了。。唯一约束,序列
取一个当前的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不会再产生冲突另外,你需要检查是什么导致了这个问题的产生,是因为缓冲池被重置或者是什么其他的原因.
取一个当前的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的值看是否已经存在于表中
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
二 为什么要用到三个序列号呢?一个不行吗?我感觉设计的有点问题
三 我推测,问题应该是这样的。
序列一是从100开始,每次递增1;序列二是从1000开始的,每次递增1。
这样在调用序列一的前899次时,过程是不会报错的。但当你第900次调用序列一时,你要通过序列号一往主键record_ID上插入1000.而1000已经被序列号二插入了,所以就报错了。
真对你的需求,我真的是建议只用一个序列号。