Oracle创建Sequence序列
202-01-19 Oracle学习之创建序列
一、Oracle版本
Oracle 11.2.0.1.0 - 64bit
Tool SQLPlus
二、序列是啥
通过学习, 认识到序列是Oracle 数据对象的一种, 是由有序增加或减少相同步长的一组序号构成, 其主要功能是用来生成数据表的主键或唯一键. 序列不在磁盘上占用存储空间, 是运行在内存中的对象.
创建语法:
CREATE SEQUENCE 序列名称
INCREMENT BY [NUM1]
START WITH [NUM2]
MAXVALUE [NUM3] | [NOMAXVALUE]
MINVALUE [NUM4] | [NOMINVALUE]
NOCYCLE | CYCLE
NOCACHE | CACHE [NUM5]
[ORDER];
三、关键字解释:
该参数指定步进值INcrement By NUM1:支持正向和逆向增量的数值类型,默认值为1;不允许设置为0(否则将无法生成有效的序列)。
当NUM1为正数是序列值越来越大,为负数时越来越小。
设置序列为初值:指定序列为起始数值(默认为1)
3. MAXVALUE [NUM3] | [NOMAXvalue]:表示序列可以生成的最大值NUM3。未设置最大值时,默认为NOMAXvalue;递增序 列的上限据说为10^27;递减序列的最大极限是-1。
4. MINVALUE [NUM4] | [NOMINVALUE ]:设定数值变量NUM4作为生成序列时的最小阈值。若未指定该数值,则系统默认赋值为NOMINVALUE;对于递增序列而言,默认起始数值设定为1。
第5点:NOCYCLE与[CYCLE]的区别在于它们是否在序列值达到最大时触发循环机制。当设置为NOCYCLE时,则表示系统不会进入循环模式。对于那些耗尽内存或存储空间的情况,建议在内存或存储空间接近限制时启用循环机制以避免溢出风险。建议在内存或存储空间接近限制时启用循环机制以避免溢出风险。要获取下一个循环起始位置,请访问user_sequences表中的last_number字段
6. NOCACHE | [CACHE] [NUM5]:设置序列是否启用缓存以及指定的缓存块尺寸,默认尺寸设定为20个单位长度。当连接被中断时会自动清除当前缓存(我的猜测)。
7. ORDER选项定义了序列是否按顺序生成,默认设置为否。对于单实例数据库没有影响,因为序列始终是有序生成的。在分布式环境下,假设缓存Cache设置为20,在实例1处理时会获取1-20号序列值并存储于内存;当实例2引用同一缓存时,则会获取后续的21-40号序列值。这样设计确保了每个实例都能获得独特的、有序的序列值。
四、创建示例:
CREATE SEQUENCE S2
INCREMENT BY 2 --步进 2
START WITH 1 --起始值 1
MAXVALUE 20 --最大值 20
MINVALUE -20 --最小值 -20
NOCYCLE --不循环
NOCACHE; --不进行缓存
五、
1. 获取当前序列的值:
select s2.currval from dual;
2. 获取下一个序列的值:
select s2.nextval from dual;
3. 查询用户下有哪些序列:
select * from user_sequences;
六、序列创建后可以进行修改:
1. alter sequence s2 increment by -2; --修改为递减序列
2. alter sequence s2 maxvalue 100; --修改最大值为100
3. 设置序列s2的缓存参数为:s2\_cache\_size = 30; --注释:该操作表示一次缓存最多可容纳s2\$变量至内存空间中。
七、知识点总结:
1. 序列是共享的调用,有引用权限的用户都可以引用它。
2. 当事务回滚时,事务中增删改的数据可以回退,但序列不会回退!!!
在一个表中,在线递增字段值可能会断开或出现不连续的情况,并非所有情况都是由其他对象直接引用导致的;有时可能是dual虚拟表或其他机制造成的。
4. 当采用NO CACHE设置时,在每次引用序列都需要进行计算的情况下会消耗性能;而启用 CACHE 机制后,则只需在缓存命中时进行一次计算即可;若希望加快序列生成速度,请考虑增大 CACHE 值;常见应用场景之一是订单号等数值型标识符的处理。
5. 如果想用序列值作为主键,序列一定要定义为NOCYCLE。
