oracle 实现自增
oracle 实现自增需要创建 squence(序列);
如果需要插入时自动增加还需要创建一个 trigger(触发器),否则需要在程序中手工设置
例如:将表fcbook的主键fid设置为自增
1. 创建squence
![](https://pic002.cnblogs.com/images/2010/127950/2010111710441984.jpg)
Name : 创建的名字
Min value : 最小计数
Max value : 最大计数
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 1
maxvalue 99999999999
start with1
increment by1
cache 20;
create sequence Rayn.SEQ_FCBOOK
minvalue 1
maxvalue 99999999999
start with1
increment by1
cache 20;
2. 创建 trigger
![](https://pic002.cnblogs.com/images/2010/127950/2010111710184218.jpg)
ORACLE触发器有以下两类:
1> 语句级(Statement-level)触发器,在CREATE TRIGGER语句中不包含FOR EACH ROW子句。语句级触发器对于触发事件只能触发一次,而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行和什么时间执行。
2> 行级(Row-level)触发器,在CREATE TRIGGER语句中包含FOR EACH ROW子句。行级触发器可对受触发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。
OK确认后,需要输入trigger_body,对应的sql补全为:
createorreplacetrigger TR_FCBOOK
before inserton fcbook
for each row
begin
SELECT SEQ_FCBOOK.Nextval INTO :new.fid FROM dual;
end TR_FCBOOK;
before inserton fcbook
for each row
begin
SELECT SEQ_FCBOOK.Nextval INTO :new.fid FROM dual;
end TR_FCBOOK;
上语法中,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中。