序列是一类对象,它可以自动的产生唯一的整数,通常用来产生主健的值,每个用户可以建立多个序列
Create sequence s1
Increment by 2
Start with 1
Maxvalue 10
Minvalue -10
Nocycle
Nocache;
SQL > Select * from user_sequences;
Sequence_name min_value max_value increment_by c o cache_size last_number
S1 -10 10 2 N N 0 1
SQL > Select s1.nextval from dual; 取序列 s1 的下一个值。
SQL > Select s1.currval from dual; 取序列 s1 的当前值。
SQL > Drop table d purge;
SQL > Create table d as select * from dept where 0 = 9;
建立一个和 dept 表结构相同,但不含任何行的空表。
SQL > Insert into d( deptno ) values( s1.nextval );
SQL > Insert into d( deptno ) values( s1.nextval );
SQL > Select * from user_sequences;
当序列没有值在内存中时,currval 属性无效,先 nextval 后,才会有效
序列的当前值一定得在最大和最小之间,步长不能为零
alter sequence s1 increment by -2;
alter sequence s1 cycle;
事物回退,序列号不会退。其它语句引用了该序列
Insert into d(deptno) values(s1.nextval);
Rollback;
Insert into d(deptno) values(s1.nextval);
Insert into dept(deptno) values(s1.nextval);
NOCACHE 每次取值都要计算。 CACHE n 一次就放入内存 n 个值。默认值为 20,如果你要连续的使用序列,如定单流水号的产生,请将 N 设大点。如果你不使用序列,而是自己写代码,请注意你的程序效率和竞争锁死情况的发生。停止数据库后,内存中存放的序列值会丢失 user_sequences 中的 last_number 列代表重新计算的起始值 序列中有一个 order 的选项,在单实例没有差别,它体现在集群 rac 环境中。默认的 Order项值为 no,就是不按照顺序发生。
例如实例 1 取 cache 为 20 的序列值,1 到 20 存储在 1 号实例内存,主机 2 再调用的时候,会将 21 到 40 存储在实例 2 的内存中。这样我们的会话在不同实例取的数值就会不同。Order 的意思为集群中的每个节点想要获得序列的值都要按照顺序得到序列的值。
一旦被删除,就不可以再引用序列的值。使用序列的原则如下:
1、如果你想用做主键,请使用不可循环的序列。
2、如果想快速发生序列的值,请将 cache 的值加大。
3、如果序列内的值要很长时间才能使用完,可以考虑使用可以循环的序列。
【【 知识点 】】