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];

三、关键字解释:

1. INCREMENT BY NUM1:步长为NUM1,NUM1可以是正数也可以是负数,但都必须是整数,默认为1,不可以是0(为0就失去了序列的意义)。

当NUM1为正数是序列值越来越大,为负数时越来越小。

2. START WITH [NUM2]:定义序列的初始值或起始值NUM2,这是序列的第一个值,默认值是 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]:ORDER选项,定义序列是否按顺序发生,默认为NO。在单实例数据库中没有区别,因为序列一定是按序发生的。在集群环境中,假如缓存Cache=20,实例1取了1-20,存储到内存中;实例2再引用同一序列时,会取21-40...这样在多实例中取到的序列值就会不同,Order定义后集群的每个实例都要按照顺序得到序列值。

四、创建示例:

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. alter sequence s2 cache 30;  --修改为缓存,缓存块大小为30,意为一次缓存最多存储30个序列值到内存中

七、知识点总结:

1. 序列是共享的调用,有引用权限的用户都可以引用它。

2. 当事务回滚时,事务中增删改的数据可以回退,但序列不会回退!!!

3. 在一个表中,序列递增的字段值可能会中断、不连续,原因是其它对象引用了这个序列,即使是dual虚拟表的引用。

4. NOCACHE设定时,每次引用序列都需要计算,会消耗性能;CACHE时,只再缓存时计算一次;如果想快速的生成序列值,请将CACHE值加大,实际应用场景,如订单号。

5. 如果想用序列值作为主键,序列一定要定义为NOCYCLE。

猜你喜欢

转载自blog.csdn.net/Ezreal_XLove/article/details/112850902