1、概况:

Oracle||PL/SQL设置主键自动递增

Oracle没有设置主键auto increment 的功能,需要自己用序列和触发器实现主键自动递增。

|实例:|

步骤1、创建表menu
create table menu( menuId number(10) not null primary key,  
    name varchar2(40) not null,  
    id_parent number(10) not null,  
    url varchar2(300) null);  
步骤2、创建序列menu_autoinc_seq
create sequence menu_autoinc_seq  
       minvalue 1  
       maxvalue 99999999  
       start with 1  
       increment by 1  
       nocycle  
       nocache  
       order;

 详解:

1)    cycle 是指循环使用序列,当达到最大值时,又循环从最小值开始使用

2)    nocycle就是不循环使用,当达到最大值时,如果还要使用此序列,就会报ora-08004错误

3)    nocache 不缓存

       如果指定NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢失。不过会产生一些问题:创建nocache sequence在高并发访问时,容易导致row cache lock等待事件,主要原因是每次获取nextval时都需要修改rowcache中的字典信息。使用nocache sequence,还会导致如下问题。由于每次修改字典信息都需要commit,可能导致log file sync等待,nocache sequence在RAC环境下,会对基于sequence生成的列创建的索引造成实例间大量索引块争用。基于以上问题,避免创建nocache sequence。

4)    cache 缓存

如果指定CACHE值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的Sequence就会丢失。举个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始

       再来看看sequence相关保护机制:
row cache lock:在调用sequence.nextval情况下需要修改数据字典时发生,对应row cache lock事件
SQ lock:在内存缓存(并非rowcache)上获取sequence.nextval时发生,对应enq:SQ-contention事件
SV lock:RAC环境下获取cache+order属性的sequence.nextval时发生,对应DFS lock handle事件

什么情况下使用cache什么时间上使用nocache?
应该尽量使用cache,因为现在的数据库很多都是在高并发的情况下运行的,首先这样可以搞性能,并且也不会产生row cache lock等待事件。可能有些人会担心数据库不正常的down掉会产生序列号间断,但这也是很少的情况。当然如果你的业务要求是绝不能产生间断的序列号,那就要使用nochache了。

5)   Order

保证序列号按请求顺序产生,A请求在B请求之间,那么A请求获取到的序列号大于B请求获取到的序列号。

步骤3、创建触发器menu_autoinc_tg
create or replace trigger menu_autoinc_tg  
before insert on menu for each row  
begin  
select menu_autoinc_seq.nextval into :new.menuId from dual;  
end menu_autoinc_tg;  
/
其中end menu_autoinc_tg;也可以写成end;仍然会创建Trigger成功。
在Command window进行创建数据库对象的时候,如果使用到了多行语句,可在结束后另起一行输入/

测试:

[sql] 
insert into menu values('','个人事务',0,'indi.php');  
insert into menu values('','公共事务',0,'public.php');
commit;select * from menu;

细水长流,打磨濡染,渐趋极致,才是一个人最好的状态。