关于ORACEL的序列问题,急死我了!!!!!!

gaoyibo8939 2005-12-20 05:43:27
各位大侠,我第一次接触ORACLE.表达不清多多谅解.
我在我的表中将产生了一个序列.比如下面的语句:
create table Unpigefile (
unpigefileid INTEGER not null,
fileno VARCHAR2(20) not null,
wordnum VARCHAR2(20) not null,
title VARCHAR2(20) not null,
organid INTEGER not null,
filetypeid INTEGER not null,
screatlevelid INTEGER not null,
keeptermid INTEGER not null,
keyword VARCHAR2(20) not null,
makedate DATE not null,
pigedate DATE not null,
roomid INTEGER not null,
dutyer INTEGER not null,
orgid INTEGER not null,
pieceno INTEGER not null,
shareno INTEGER not null,
submiter INTEGER not null,
wrapflag INTEGER not null,
place VARCHAR2(20) not null,
remark VARCHAR2(100),
fileflag INTEGER not null,
constraint PK_UNPIGEFILE primary key (unpigefileid)
)
CREATE SEQUENCE SEQ_Unpigefile START WITH 1 INCREMENT BY 1 MINVALUE 1 NOCYCLE NOCACHE ORDER

由于库表里已经有一些记录了.我现在往库表里插入记录的时候,总是抛出这样的异常:
java.sql.SQLException: ORA-00001: 违反唯一约束条件 (ARCH.PK_UNPIGEFILE)
如果我将库表里的记录清掉.我就可以顺利插入.
这是为什么?
...全文
213 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoyibo8939 2005-12-21
  • 打赏
  • 举报
回复
谢谢duanzilin(寻) 大哥。
我是这样做的。因为我不会写触发器。所以在程序,中每次执行插入语句之前,按照boydgmx(梦霄) 大哥说得那样,得到序列最值。删除序列。新建序列并且起始值为前最值+1。然后执行我的插入语句。我感觉执行效率还可以,不是太慢。呵呵。现在贴。谢谢各位参与。
沝林 2005-12-21
  • 打赏
  • 举报
回复
关键问题是楼主插入数据的问题,如果程序里数据插入数据方式不统一,就算用最大序号做为序列起始值也没用,可能过段时间又会存在这样的数据,不会每次都在程序里重建序列吧,可以使用max(unpigefileid)+1来产生新的主键值,但是这样就没必要用序列了,还有用触发器也没必要用序列的
nicolas1999king 2005-12-21
  • 打赏
  • 举报
回复
把序列的初始值设为足够大不就好了吗
gaoyibo8939 2005-12-21
  • 打赏
  • 举报
回复
明白了。谢谢各位。
我看了一些介绍可以使用什么触发器。不知道怎么实现。其实就是在我插入动作之前做 boydgmx所说的事情。不知怎么实现。我只是想多学些东西,望各位大侠赐教.
boydgmx 2005-12-21
  • 打赏
  • 举报
回复
不知道你明白了没有,再说一下吧:

--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;
boydgmx 2005-12-21
  • 打赏
  • 举报
回复
我是说你重新定义序列的时候,那个 start with 后面的数值就是 max(unpigefileid) + 1

不好意思,我没说明白
常遇道 2005-12-20
  • 打赏
  • 举报
回复
先读出数据表的max(unpigefileid) bb
bb++
然后再插入表中
gaoyibo8939 2005-12-20
  • 打赏
  • 举报
回复
to boydgmx(梦霄) ( ) 信誉:98
谢谢大侠.
请问怎么实现注意那个 10001 就是 max(unpigefileid) + 1 ,不好意思,我太笨笨了
gaoyibo8939 2005-12-20
  • 打赏
  • 举报
回复
我确定hibernate与SQL插入都使用的一个序列。
gaoyibo8939 2005-12-20
  • 打赏
  • 举报
回复
谢谢热心人,duanzilin(寻) ( ) 信誉:120
把表数据清空再执行程序肯定没有问题。可是现在还要保留表中的内容。能不能通过一些SQL语句实现我以后每往里插入一条记录,比如,取出当前序列的值,然后删除当前序列,新建一个序列,将上一序列的值+10做为当前序列的起始位置并返回。
boydgmx 2005-12-20
  • 打赏
  • 举报
回复
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

这样就不会出错了
沝林 2005-12-20
  • 打赏
  • 举报
回复
注意主键是不能重复的,程序里处理方法要统一,如果随便插入的话当然会出错
沝林 2005-12-20
  • 打赏
  • 举报
回复
怎么会跟用户有关呢,问题已经很清楚了啊,你的主键值是从序列中产生的,所以必须保证不同地方插入的时候使用的是同一个序列,也就是说用HIBERNATE插入的时候主键值必须也要使用ARCH.SEQ_Unpigefile这个序列产生,满足以上条件后把表数据清空,再执行程序
gaoyibo8939 2005-12-20
  • 打赏
  • 举报
回复
难道不能同时使用HIBERNATE与SQL往库里插入吗?
gaoyibo8939 2005-12-20
  • 打赏
  • 举报
回复
我用我的SQL语句在另一个用户下的同样结构的表中往里插入没有问题。是不是与用户有关系呀。
gaoyibo8939 2005-12-20
  • 打赏
  • 举报
回复
我插入之前,有一些数据是通过JAVA+HIBERNATE插入的.我主要负责导数据这一块是通过SQL实现的.在我通过SQL往里插入之前,表里已经存在了通过HIBERNATE插入的数据.
沝林 2005-12-20
  • 打赏
  • 举报
回复
是不是你在插入之前表中已经有数据了,而这些数据的unpigefileid值又不是通过序列产生的,然后插入的时候出现了主键重复了
gaoyibo8939 2005-12-20
  • 打赏
  • 举报
回复
这是我将来在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,remark) values (ARCH.SEQ_Unpigefile.nextval,?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧