往oracle数据库中新增加一条数据如何自动生成ID
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了往oracle数据库中新增加一条数据如何自动生成ID相关的知识,希望对你有一定的参考价值。
用eclipse开发javaweb项目,如何实现往oracle数据库中新增一条数据,其ID为自动生成的,int型
oracle 中不能设置自动增加,这个和其他数据库不一样,但是有 序列,这个是Oracle自己特有的东西,首先创建序列:
create sequence seq;
这就创建好了,然后 seq.nextval 就会返回一个值,不会重复的值,
insert into tablename values(seq.nextval,\'001\',\'javabook\');
insert into tablename values(seq.nextval,\'001\',\'javabook\');
insert into tablename values(seq.nextval,\'001\',\'javabook\');
这样前3个id 分别是 1,2,3 参考技术A 先在数据库中新增一个序列,如在oracle数据库中执行如下语句新增一个名为test_seq的序列
CREATE SEQUENCE test_seq
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
以后你往某表中插入数据时,直接用如下形式就行了,比如:
insert into test_table VALUES (test_seq.nextval, ......)
test_table的第一列就是你要自增的那个id,test_seq.nextval就是从新增的序列中取出下一个值,每取一次都会+1.
当然,一般来说不同的表需使用不同的序列,这样它们的id可以保证连续追问
哦哦,懂了,谢谢。
还想问问,一条insert语句或者update语句能同时操作两张表吗?
肯定不能啊,你是想实现"如果一张表操作失败,另一张就不能操作"这个功能吗,如果想的话可以用事务回滚来实现,操作前取消自动提交,设置保存点,然后依次执行两条sql,如果执行失败或者有异常,就执行回滚.
有关保存点及事务回滚的可参考如下例子(字数超长了,上图):
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;
...
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数据库中新增加一条数据如何自动生成ID的主要内容,如果未能解决你的问题,请参考以下文章