您好,欢迎访问一九零五行业门户网

ORACLE sequence各参数及创建修改删除使用详解示例

oracle没有自增数据类型,如需生成业务无关的主键列或惟一约束列,可以用sequence序列实现。 create sequence语句及参数介绍: 详见官方文档:http://docs.oracle.com/cd/b19306_01/server.102/b14200/statements_6015.htm#sqlrf01314 创建序列:需要有create
oracle没有自增数据类型,如需生成业务无关的主键列或惟一约束列,可以用sequence序列实现。
create sequence语句及参数介绍:详见官方文档:http://docs.oracle.com/cd/b19306_01/server.102/b14200/statements_6015.htm#sqlrf01314
创建序列:需要有create sequence或者create any sequence权限,
create sequence [ schema. ]sequence
     [ { increment by | start with } integer
     | { maxvalue integer | nomaxvalue }
     | { minvalue integer | nominvalue }
     | { cycle | nocycle }
     | { cache integer | nocache }
     | { order | noorder }
     ];    
create sequence各参数详解:schema  指定在哪个用户的schema下创建sequence,如不指定,默认在当前用户下创建。
sequence    指定要创建的sequence序列名
注意:如果只指定以上参数,将启动一个从1开始,以1为单位递增,没有最大值限制的递增序列。
如果要创建一个没有约束的序列,递增序列时:忽略maxvalue参数或指定nomaxvalue;递减序列:省略minvalue参数或指定nominvalue。
如果要创建一个有限制的序列,递增序列时:指定maxvalue参数;递减序列:指定minvalue参数。此时序列达到限制后会报错:
如果要创建一个有限制的序列在达到限制后重新启动,指定maxvalue和minvalue后,还需要指定cycle。如果不指定minvalue,默认为nominvalue,这个值是1.
######
increment by 指定序列号间的间隔,这个整数值可以是任何正整数或负整数,但不能是0。这个值最多有28个数字。绝对值必须小于maxvalue与minvalue的差异(如非在此区间报错:ora-04005: increment must be less than maxvalue minus minvalue)。如果这个值是负的,则该序列下降。如果该值为正,则序列上升。如果省略此子句,则间隔缺省为1。
start with指定要产生的第一个序列号。
此子句启动一个递增序列,要大于最小值;或启动一个递减序列,小于它最大值。对于递增序列,默认值是序列中的最小值。对于递减的序列,默认值是序列中的最大值。这个整数值可以最多28个数字。
这个值和达到限制的最大/最小值后重新启动时的值没有关系(如递增序列创建时指定有最大值最小值且指定cycle,则序列达到最大值后,会从最小值开始;如未指定兼包最小值,默认1开始。
maxvalue 指定序列可生成的最大值。这个整数值可以最多28个数字。maxvalue必须>=start with、必须大于minvalue。
nomaxvalue:指定nomaxvalue表示递增序列的最大值是10的27次方,或递减序列最大值为-1。这是默认的。
minvalue:指定序列的最小值。这个整数值可以最多28个数字。minvalue必须nominvalue:指定nominvalue来表示递增的序列最小值为1,递减序列为负10的26次方。这是默认的。
cycle:指定循环,表明序列在达到它的最大或最小值后生成的值。当递增序列达到最大值后,再从最小值开始循环。当递减序列达到最小值,从最大值开始循环。
nocycle:指定nocycle以指示该序列不能在达到其最大值或最小值后产生更多的值。这是默认的。达到最大值会报错:ora-08004: sequence test_seq.nextval exceeds maxvalue and cannot be instantiated
cache :指定数据库为序列预分配多少个值放在内存中以便更快访问。这个整数值可以最多28个数字。该参数最小值为2;这个值必须小于一个cycle循环的数(比如从1-100是一个循环,cache要小于100,不然可能 一次cache的值要有重复的会出错。报错是:ora-04013: number to cache must be less than one cycle)。
计算公式是:(ceil (maxvalue - minvalue)) / abs (increment)
如果系统故障,内存中未使用的cache值会丢失,将会导致序列不连续。    oracle建议在rac中使用cache来提高性能。
nocache  :指定该序列值不被预分配。如果省略cache和nocache,数据库默认会缓存20个序列号。
order :只有在rac时需要指定,指定order 是为了保证序列号是因为有请求才生成的。在使用序列号做为一个时间戳时很有用。
noorder:这是默认的。
使用sequence时对系统性能大致有以下影响: -->seq$基表
详见:http://blog.itpub.net/17203031/viewspace-717042
1.seq$基表是记录系统sequence的数据字典表.每次调用nextval,会递归调用并更新 、commit seq$基表。
2.更新seq$基表并提交会产生redo log--几百字节,commit频繁会造成lgwr的压力;过多redo log生成,造成lgwr压力、恢复时费时等。
3.多个会话使用sequence可能出现争用,等待事件row lock contention
对于nocache/cache参数:
nocache:每次使用nextval,都会更新seq$基表并commit。
cache:只有在内存中cache的序列号使用完后才会重新获取sequence,才会更新seq$基表并提交。比如cache设置为2000,则在使用sequence时对性能影响比nocache小上百倍。
所以一般情况下,建议设置一个较大的cache值,用于进行性能的优化。(默认不指定nocache时是20)
rac时,如果序列号不要求有序建议用noorder+cache
#####################################################
oracle sequence创建示例:create sequence bys.test_seq
increment by 3
start with 5
maxvalue 18
minvalue 4
cycle
cache 4;
在bys用户下创建名为test_seq的sequence
从5开始,每次增加3,最大值是18,最小值是4
允许重用,cache 4 表示会缓存四个序列号,比如5 8 11 14
当然在实验中也可以使用最简单的:create sequence bys.test_seq2;  其它参数不写,使用系统默认哈哈
#####################################################
oracle sequence修改和删除示例:alter sequence [ schema. ]sequence
  { increment by integer
  | { maxvalue integer | nomaxvalue }
  | { minvalue integer | nominvalue }
  | { cycle | nocycle }
  | { cache integer | nocache }
  | { order | noorder }
  }
修改时的三个注意事项:
如果要使序列start with不同的数字,只能删除序列重建。
如果在使用nextval初始化序列前改变increment by的值,一些序列号会被跳过。解决跳过问题的方法--删除重建
修改的各个参数的新值依然要满足create sequence各参数介绍中的描述。
nextval初始化序列前改变increment by的值示例:
create sequence bys.seq3
increment by 3
start with 5
maxvalue 18
nominvalue
cycle
cache 4;
bys@ bys3>alter sequence bys.seq3 increment by 5;  --初始化前修改
sequence altered.
bys@ bys3>select seq3.nextval from dual;   --初始化时确实跳过了一些数字。。
   nextval
----------
         7
bys@ bys3>select seq3.nextval from dual;
   nextval
----------
        12
示例修改语句:
alter sequence customers_seq maxvalue 1500;
alter sequence customers_seq cycle cache 5;
删除序列语句:
drop sequence [ schema. ]sequence_name ;
如:bys@ bys3>drop sequence bys.seq2;
############################
oracle sequence使用示例   详见官方文档--http://docs.oracle.com/cd/b19306_01/server.102/b14200/pseudocolumns002.htm#i1006157
序列常见使用场景:
可以在select 语句,create table ... as select语句, create materialized view ... as select中使用。
在update的set中,在insert 的子句或values中。序列可以由多个用户同时访问而不产生等待或锁定。
第一次查询要用 nextval,返回序列的初始值。
查询当前序列号用:currval,返回的是最后一次引用nextval返回的值。
查询下一个序列号用nextval--用此命令时,sequence会先增加1或increment by指定的值,然后返回sequence值
本实验中的查询:
bys@ bys3>select test_seq.currval from dual;   ---未使用nextval初始化,故报此错。
select test_seq.currval from dual
       *
error at line 1:
ora-08002: sequence test_seq.currval is not yet defined in this session
bys@ bys3>select test_seq.nextval from dual;  第一次使用nextval,显示的是创建时start with指定的值
   nextval
----------
         5
bys@ bys3>select test_seq.currval from dual; 使用currval查到当前序列号---最后一次引用nextval返回的值
   currval
----------
         5
#######
bys@ bys3>select test_seq.nextval from dual;   --一直执行nextval,观察序列达到maxvalue指定的值后如何循环使用
   nextval
----------
        17
bys@ bys3>select test_seq.nextval from dual;  --序列达到maxvalue指定的值后返回的是minvalue指定的值而不是start with了。如未指定minvalue或指定nominvalue,则是返回1.
   nextval
----------
         4
########
bys@ bys3>insert into test values(test_seq.nextval,'seqtest');   --使用insert语句调用序列
1 row created.
bys@ bys3>select * from test;
object_name  status
------------ -------
10           seqtest
bys@ bys3>insert into test values(test_seq.currval,'seqtest');
1 row created.
bys@ bys3>select * from test;
object_name  status
------------ -------
10           seqtest
10           seqtest
bys@ bys3>insert into test(object_name) select test_seq.nextval from dual;     --使用insert子语调用序列
1 row created.
bys@ bys3>select * from test;
object_name  status
------------ -------
10           13
10           16
4
###########
bys@ bys3>update test set status=test_seq.nextval;    --使用update语句调用序列
2 rows updated.
bys@ bys3>select * from test;
object_name  status
------------ -------
10           13
10           16
bys@ bys3>delete test where status=test_seq.currval;  --delete中不能使用sequence做条件
delete test where status=test_seq.currval
                                  *
error at line 1:
ora-02287: sequence number not allowed here
###################
利用解发器自动为表插入递增序列:---类似自增字段的作用建解发器代码为:
create or replace trigger tri_test_id
  before insert on test     --test 是表名
  for each row
declare
  nextid number;
begin
  if :new.testid is null or :new.testid=0 then --departid是列名
    select seq1.nextval     --seq1是提前创建好的序列的名字
    into nextid from sys.dual;
    :new.testid:=nextid;
  end if;
end tri_test_id;
其它类似信息

推荐信息