sequence的作用和用法

seqence的作用:

sequence号是数据库系统按照一定规则自增的数字序列,因为自增所以不会重复。目前就我所了解的sequence的作用主要有两个方面。
一:作为代理主键,唯一识别;
二:用于记录数据库中最新动作的语句,只要语句有动作(insert/delete等),sequence号都会随着更新,所以我们可以根据sequence号来select出更新的语句。

sequence的用法:

create seqence sequence_name 
[start with n1]           ----------------->n1到n5都是整数;start with 生成的第一个n1值
[increment by n2]         -----------------> increment by n2 递增量,可以为正整数或负整数,指明每一次增加多少
[maxvalue n3|no maxvalue] ----------------->maxvalue最大值,no maxvalue用于指定序列没有上限
[minvalue n4|no minvalue] ----------------->minvalue 最小值,no minvalue,没有指定最小下限
[cache n5|no cache]       ----------------->cache 用高速缓存中可以预分配的序列号个数,默认是20。 如果缓存中的序列号没有用完就关闭数据库等其它原因.
                                        没有使用的序列号就丢失了,所以不能保证序列号是连续的。nocache高速缓冲中不预分配序列号,每次只生成一个序列号,
                                        虽然降低了获取序列号的速度,但是可以保证序列号的连续性。
[cycle|no cycle]          ----------------->cycle 序列达到最大值或最小值后是否循环,默认不no cycle。如果使用NO CYCLE 选项,那么在序列达到最大值或最小值之后,如果再试图获取下一个值将返回一个错误。
如果使用CYCLE 选项,那么在序列达到最大值或最小值之后,可复位并继续下去。如果达到极限,生成的下一个数据将分别是最小值或者最大值。
[order|no order]           ----------------->order用于指定按顺序生成序列,只有在RAC时需要指定,指定ORDER 是为了保证序列号是因为有请求才生成的。
                                  在使用序列号做为一个时间戳时很有用,no order是不指定按顺序生成序列(默认)。

创建一个sequence:

create sequence sequence_name as int 
minvalue 1000 
maxvalue 1000000000 
start with 1000 
increment by 1 
no cache;
或者
create sequence sequence
_name 
minvalue 1000 
no maxvalue 
start with 1000 
increment by 1 
no cache;

sequence的使用:

------->引用下一个序列值

sequence_name.nextval

-------->引用当前序列值

sequence_name.currval/seqence_name.nextval.currval ,必须最少经过一个nextval才能引用currval

在表中使用sequence:

create table tab_name(col_int int, col_varchar varchar(20), col_seq int);
insert tab_name into values(1, 'abc', nextval for sequence_name);   或者 insert tab_name into values(1, 'xyz', sequence_name.nextval);
insert tab_name into values(2, 'fgh', nextval for sequence_name);   或者 insert tab_name into values(2, 'fgh', sequence_name.nextval);
update tab_name set col_varchar='678', 
col_seq=sequence_name.nextval where col_int=2; 
delete tab_name col_sql=sequence_name.nextval where col_int=1;

单独使用查询sequence:

select sequence_name.nextval from dual;------>每执行一次sequence号会一直增加

select sequence_name.currval from dual;------->执行多少次都不会变化

改变sequence:

比如对以上创建的sequence除了初始值以外的值进行修改:
alter sequence_name minvalue 100000 maxvalue 99999999 increment by 10 cache 10 cycle;

删除sequence:

drop sequence sequence_name;
 

利用解发器自动为表插入递增序列(类似自增字段的作用):

建解发器代码为:
create or replace trigger trigger_id
before insert on tabname
for each row
declare
nextid number;
begin
IF :new.col_seq IS NULL or :new.col_seq=0 THEN
select sequence_name.nextval
into nextid from sys.dual;
:new.col_seq:=nextid;
end IF;
end trigger_id;
或者
create trigger trigger_id before
insert on tabname
for each row 
begin
select sequence_name.nextval 
into:new.col_seq 
from dual;
end trigger_id;
或者
create or replace trigger trigger_id
before insert or update of col_seq
on tabname
for each row
begin
if inserting then
select sequen_name.nextval into:new.col_seq from dual;
slse
raise_application_error(-20020, '不允许更新ID值!');
end if;
end;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值