oracle中自增长序列如何让它从数据表中现存的ID号开始增长。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中自增长序列如何让它从数据表中现存的ID号开始增长。相关的知识,希望对你有一定的参考价值。

比如Account表中已经存在数据

ID UNAME PASSWD IDCARD BALANCE STATUS OPENDATE
---- -------------------- ------ ------------------ ---------- ---------- --------------
1 陈xxx 123456 420323191910313315 1000 1 19-9月 -12
2 安xx 123456 420323191910013315 1000 1 19-9月 -12
3 张三 123456 420323198310023215 1000 1 19-9月 -12
4 小刘 123456 420323198010033515 1000 1 19-9月 -12

我创建了一个自增长序列sqId:
create sequence sqId
increment by 1
start with 1
maxvalue 9999
nocycle
nocache
/
然后插入一条数据
insert into BAccount(ID,uname,passwd,IDCard,balance,status)
values(sqId.nextval,'大象','123456','420323193910043715',1000,1);
如何让 此处插入的数据的ID是从5开始了?

三种方法:
1. 需要将你的序列先删掉,然后重新建立,直接在create的时候start with 5就行了...
create sequence sqId
increment by 1
start with 5
maxvalue 9999
nocycle
nocache

2. 使用pl/sql developer的话,直接编辑你的序列,把next number 设置成5就行了。

3. 执行下面语句5次(数值太大量肯定不行):
select sqld.nextval from dual;
意思就是让当前序列的值先增到5,就可以了。

建议使用第一和第二个~追问

我的意思是如果我们不知道BAccount表当前的ID的值,就用SQL语句,你如何达到同样的效果?

追答

两种解决办法:
1. 直接select max(id) from BAccount,将这个查询结果赋值给一个变量,例如变量 i ,即当前最大的ID,那么插入的时候,直接使用 i+1作为ID就行了。
要是这样的话,序列就没啥用了...
2. 还是要查询出最大的ID,然后跟序列的nextval比较,如果序列的值比ID要小,那么写个循环将差值补上来,然后使用nextval来insert,这个就绕了弯子了...
for ...loop
select sqld.nextval from dual;
...

参考技术A insert into BAccount(ID,uname,passwd,IDCard,balance,status)
values(sqId.nextval+4,'大象','123456','420323193910043715',1000,1);

或者直接把序列的下个值改了就行了。追问

如果我们不知道BAccount表当前的ID,你如何达到同样的效果?

追答

select max(BAccount.id) into ll_id from BAccount;
insert into BAccount(ID,uname,passwd,IDCard,balance,status)
values(sqId.nextval+id ,'大象','123456','420323193910043715',1000,1);
你这序列有用吗哥们。是个无用的。

追问

比如我的这个ID是银行卡号,我设置每次有一个客户开户的时候,账户表BAccount表中的ID自动增长,难道没用么?

追答

真没用,要想你这么用还不如先判断最大值呢,比你这个强吧。
你这种取法没意义,一个最大值搞定,比你序列跳号还要好。
要不你就开始把序列规划好。再把序列用起来

追问

恩,的确,你的这个办法也好,谢谢高手!我的积分用完了,没有什么分给你,你的知识是无价的,十分感谢!

追答

不是要你送分解决问题关键

本回答被提问者采纳
参考技术B 把序号的开始弄好就行了

Oracle 数据库中序列结合触发器实现主键自增长

一、数据表名称为T_OFFICE,其主键为PID(number类型)

二、首先为数据表的PID字段创建序列

序列名称:S_T_OFFICE_PID

序列详细内容:

三、创建相应的触发器

触发器名称:T_OFFICETRIGER

触发器具体内容:

create or replace
TRIGGER
HYMGS_INDUSTRY_FQ6.T_OFFICETRIGER
BEFORE INSERT ON HYMGS_INDUSTRY_FQ6.T_OFFICE FOR EACH ROW
BEGIN
select S_T_OFFICE_PID.nextval into :new.PID from dual;
END;

 

注释:插入新数据前 更新PID主键的值

 四、土豪打赏

             

 

以上是关于oracle中自增长序列如何让它从数据表中现存的ID号开始增长。的主要内容,如果未能解决你的问题,请参考以下文章

oracle自增长

SQLIte如何设置自动增长的字段?

oracle数据库怎么建sequences作为自增长序列

SQLIte如何设置自动增长的字段?

Oracle 数据库中序列结合触发器实现主键自增长

Oracle 序列