用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列。html
查阅资料后发现 Oracle 的自增列须要手动编写。sql
1.一、建立序列(sequence)数据库
create sequence [sequence_name] --建立序列 increment by 1 --递增步长为1 start with 1 --开始值为1 nomaxvalue --没有最大值 (设置最大值:maxvalue 1000) minvalue 1 --最小值为1 (不设最小值:nominvalue) nocycle --不循环 (设置循环:cycle) cache 20; --缓存20 (不设缓存:nocache)
序列的全部属性都是选择设置(非必须设置),若所有属性使用默认值可直接使用 create sequence [sequence_name]; 缓存
1.二、各属性默认值oracle
increment (步长): 1;flex
start (开始值) : 1;spa
maxvalue (最大值) : 10的28次方;3d
minvalue (最小值) : 1 ;code
cycle (循环) : no ;orm
cache (缓存) : 20 ;
1.三、序列使用
1.3.一、当前序列值: [sequence_name].currval --当前序列值
在dual表中查看当前序列值: select [sequence_name].currval from dual;
1.3.二、下一个序列值(实现自增): [sequence_name].nextval --下一个序列值
初建立的序列必须先调用一次 nextval 才能使用 currval , 由于初次建立的序列没有当前值,因此必须产生一个值以后才有当前值。
1.四、序列中缓存的理解
序列中的缓存是就是一次性储备必定数量的空间,相似数据库初创时设置的自增大小同样;当序列被使用至当前最大储备值时,系统将再次准备缓存数量的空间。用系统表 user_sequence 记录序列对象的变化来帮助理解缓存(重点看 last_number 的变化)。
初创序列时的数据状况
当调用一次 nextval 后
当序列值使用到当前 laser_number 时, laser_number 值 = 当前last_number + cache_size
建立序列后就已经能够实现自增列的效果,例:
insert into ryxxb values (AUTOSEQ.nextval,'张三',AUTOSEQ.nextval + 100,'男') --给人员信息表插入一条数据 id和编号 就使用序列
2.一、建立触发器基本语法
CREATE OR REPLACE TRIGGER [trigger_name] {[before] | [after] | [instead of]} --{[以前] | [以后 | [替换]} 触发时机 {[insert] | [delete] | [update[of column]]} --{[插入] | [删除] | [更新]{更新时可指定列名,仅在更新指定列时才会触发}} 触发操做 ON {[table_name] | [view_name]} --{[代表] | [视图名]} 触发器目标 [FOR EACH ROW] --可选 触发器类型 [FOR EACH ROW (行级触发器)] 或 语句触发器 [WHEN (condition)] --可选 触发条件 可选择加入触发条件 BEGIN [pl\sql] --触发器执行内容 END
2.二、为自动序列建立触发器
create trigger autotri --建立触发器 before insert on ryxxb --[ryxxb]在执行[insert]操做以前触发 for each row --行级触发器 -- 触发器内容 begin select autoseq.nextval into :new.ryid from dual; --取下一个序列值赋值给[ryid]字段 select (autoseq.currval + 100) into :new.rybh from dual; --取当前序列值赋值+100给[rybh]字段 end;
3.一、手动清空序列
1)查看当前序列的值: select seq_auto.currval from dual;
2)根据当前序列值设置序列负步长: alter sequence seq_auto increment by -120;
3)获取next序列值: select seq_auto.nextval from dual;
4)还原序列步长: alter sequence seq_auto increment by 1;
3.二、用储存过程实现自动清空序列
create or replace procedure pro_clear_seq(v_seqname varchar2) -- 建立储存过程 par:要清空的序列名 as n number(10); tsql varchar2(100); begin execute immediate 'select '||v_seqname||'.nextval from dual' into n; -- 获取序列当前值 n:=-(n-1); tsql:='alter sequence '||v_seqname||' increment by '|| n; -- 更新步长为当前序列负值 execute immediate tsql; execute immediate 'select '||v_seqname||'.nextval from dual' into n; -- 获取next序列值 tsql:='alter sequence '||v_seqname||' increment by 1'; -- 还原步长为1 execute immediate tsql; end seq_reset;
执行储存过程:
begin pro_clear_seq('seq_auto'); end;
<<============================================================================================================================================>>