oracle主键自增长

--首先建一个表TEST

 
create table TEST
(
  NID int PRIMARY KEY ,
  test1 varchar2(20),
  test2 varchar2(20),
  test3 varchar2(20),
  test4 varchar2(20),
  test5 varchar2(20)
)

-- 再建一个序列SEQ_TEST 

 
create sequence SEQ_TEST
minvalue 1        --最小值
nomaxvalue        --不设置最大值
start with 1      --从1开始计数
increment by 1    --每次加1个
nocycle           --一直累加,不循环
nocache;          --不建缓冲区

    以上代码完成了一个序列(sequence)的建立过程,名称为SEQ_TEST,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓,建议用cache,因为时间就是金钱呀!) 
你只有了表和序列还不够,最好再建一个触发器来执行它!代码如下:
 
 
CREATE OR REPLACE TRIGGER tg_test
BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null )
begin
select seq_test.nextval into :new.nid from dual;
end ;
      下面是测试
 
 
select * from test
insert into test(nid,test1) values (6, 'aaa' )
insert into test(test1) values ( 'bbb' )

 

重置的方法有以下几种:

 -------------------------------------------------------------------------------------------------------------------------------------------

Oracle 序列(Sequence)主要用于生成流水号,Oracle EBS系统中是经常用到的。但是,有时需要修改序列初始值(START WITH)时,好多人凭感觉认为:Alter Sequence SequenceName Start With N。事实上,在Oracle Db中,修改序列没有这样的语法。没有这样的语法情况怎么办,有二种方法可以完成

        1.先删除序列,然后重新创建。不过这不是当前要讲的重点。这个方法比较方便。

        2.通过Increment By来实现修改初始值。

            例如:若序列名称是SeqTest2010_S,初始值是13,而现在要设置初始值为1020,Increment By值为:1007(1020-13)

            2.1 执行:Alter Sequence SeqTest2010_S Increment By 1007;

            2.2 执行:Select SeqTest2010_S.NextVal From Dual;

            2.3 执行:Alter Sequence SeqTest2010_S Increment By 1;

            修改完成。简单吧

 

 -------------------------------------------------------------------------------------------------------------------------------------------------------------------

如果直接drop掉,与这个sequence相关的function trigger什么的在下次运行的时候都会重新编译,而且编译有可能会失败,所以采用了下边的方法:

  假设sequence seq属性如下:

  increment 1

  minvalue 1

  则用下边方法:

  alter sequence seq minvalue 0;

  select seq.nextval from dual; --假设值是30

  alter sequence seq increment -30;

  select seq.nextval from dual; --会得到0

  alter sequence seq minvalue 1;

  alter sequence seq increment 1;

  这样之后再取的时候就会从1开始了。

 

 

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

有一Oracle Sequence如下:

 

1 CREATE SEQUENCE DEMO.S_CUST_ID
2     START WITH 2
3     MAXVALUE 10000000
4     MINVALUE 1
5     CYCLE
6     NOCACHE
7     NOORDER;

 


如需重置该Sequence,让nextVal返回的是最原始的值可以使用如下方法:

 

1 ALTER SEQUENCE DEMO.S_CUST_ID
2     INCREMENT BY 1
3     MINVALUE 1
4     MAXVALUE 10000000
5     NOCACHE 
6     CYCLE 
7     NOORDER;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值