oracle 实现自增需要创建 squence(序列);

如果需要插入时自动增加还需要创建一个 trigger(触发器),否则需要在程序中手工设置

例如:将表fcbook的主键fid设置为自增 

1. 创建squence

oracle实现自增--序列_oracle

Name : 创建的名字

Min value : 最小计数

Max value : 最大计数

(创建一个序列从1开始自增,最大值到999999999。

或者不设置最大值)

Start with : 起始计数

Increment by : 步长

Cache size : 缓存序列

指定Cache,oracle会预先在内存中放置一组指定大小的序列,当使用完这些序列后再生成下一组,这样会存取得快些,但当数据库关闭等情况时,下一次再生成序列时可能会使序列间断,不是一串连续的号,当不是特别需要连续的序列时最好指定;

不填写Cache值,会使用默认设置,我这里是20;

当Cache size设置为0时 为nocache,这样会产生连续的序列。

Cycle : 循环序列,当到达最大值后从最小值重新开始

Order : 保证序列产生的顺序和请求的顺序是一致的,在并行模式下如果A、B同时对序列请求那么先产生的序列号必然返回给先请求的用户。例如当前序列号为10,A先请求B后请求那么11一定返回给A,12给B,在noorder的情况下,有可能11给B,12给A。这种情况只发生在oracle并行服务器上,大多数情况下不需要。

相应的squence创建sql:

-- Create sequence
create sequence Rayn.SEQ_FCBOOK
minvalue 1maxvalue 99999999999start with 1increment by 1cache 20;

使用序列:

insert into article values (Raun.nextval,'TEST','test content');

删除序列:

drop sequence Rayn;

2. 创建 trigger

oracle实现自增--序列_oracle_02

ORACLE触发器有以下两类:

 1> 语句级(Statement-level)触发器,在CREATE TRIGGER语句中不包含FOR EACH ROW子句。语句级触发器对于触发事件只能触发一次,而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行和什么时间执行。

 2> 行级(Row-level)触发器,在CREATE TRIGGER语句中包含FOR EACH ROW子句。行级触发器可对受触发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。

OK确认后,需要输入trigger_body,对应的sql补全为:

create or replace trigger TR_FCBOOK  
  before insert on fcbook for each row
begin  
  SELECT SEQ_FCBOOK.Nextval INTO :new.fid FROM dual;
end TR_FCBOOK;
或者不使用触发器,在INSERT语句中直接使用s_id.nextval获取下一个自增值。

上语法中,trigger_event 是对应于DML的三条语句INSERT、UPDATE、DELETE;table_name是与触发器相关的表名称;FOR EACH ROW是可选子句,当使用时,对每条相应行将引起触发器触发;condition是可选的ORACLE BOOLEAN条件,当条件为真时触发器触发;trigger_body是触发器触发时执行的PL/SQL块。

在触发器体内,行级触发器可以引用触发器触发时已存在的行的列值,这些值倚赖于引起触发器触发的SQL语句。

1> 对于INSERT语句,要被插入的数值包含在new.column_name,这里的column_name是表中的一列。

2> 对于UPDATE语句,列的原值包含在old.column_name中,数据列的新值在new.column_name中。

3> 对于DELETE语句,将要删除的行的列值放在old.column_name中。