oracle中设置自增主键

来源:互联网 发布:服务器硬盘恢复数据 编辑:程序博客网 时间:2024/05/01 21:55

新建序列

create   sequence   name     
increment   by   x   //x为增长间隔     
start   with     x   //x为初始值     
maxvalue         x   //x为最大值   nomaxvalue    不设置最大值
minvalue         x   //x为最小值     nominvalue   不设置最小值
cycle                //循环使用,到达最大值或者最小值时,从新建立对象 (从头开始,也可以为nocycle)    
cache            x   //制定缓存序列值的个数   

 删除序列        drop sequence 序列名

如果指定CACHE值,oracle就可以预先在内存里面放置一些       sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。


但是要注意的是:第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL总是返回当前sequence的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。
------------------------一个例子-----------------------
create   sequence   for_test  --序列名     
increment   by   1     --每次增加1
start   with   1     --从1开始
nomaxvalue     --没有最大值
nocache        --没有缓存序列

----------------------------创建测试表------------------
create table Test
(
TestID int primary key,
TestName varchar2(20) not null,
Tdescription varchar2(200) null
)

-----------------------------使用序列-------------------
insert into Test
values(for_test.nextval,'序列测试','这是一个序列使用的例子')

--------------------序列使用结果查询-----------------
select * from test

触发器

1

CREATE or replace TRIGGER "触发器名称" BEFORE
INSERT ON Test FOR EACH ROW WHEN (new.TestID is null)
begin
select for_test.nextval into: new.TestID from dual;  //for_test  序列名 
end;

INSERT INTO Test (TestName,Tdescription ) Values('Cao','Heibei');

删除触发器     drop trigger 触发器名称

2

create or replace trigger trigger_name
before insert on your_sid.tablename
for each row
begin

declare
i number;
cursor cur is select max(id) from your_sid.tablename;

BEGIN
open cur;

FETCH cur INTO i;

if i is NULL then
:new.id := 0;  //可以根据实际需要来定初始值
else
:new.id := i + 1; //这里以1递增
end if;

Close cur;
END;

END;
/

其中:your_sid为数据库的当前用户SID,tablename为表名,id为列名

序列提供两个方法,NextVal和CurrVal。顾名思义,NextVal为取序列的下一个值,一次NEXTVAL会增加一次sequence的值;CurrVal为取序列的当前值。
 
原创粉丝点击