Oracle数据库——序列的创建

1.序列的定义

(1)序列的概念

①序列用于产生唯一序号的数据库对象,可以为多个数据库用户依次生成不重复的连续整数,通常使用序列自动生成表中的主键值

②序列产生的数字最大长度可达到38位十进制数。序列不占用实际的存储空间,在数据字典中只存储序列的定义描述

(2)序列的特点

①可以为表中的记录自动产生唯一序号

②由用户创建并且可以被多个用户共享

③典型应用是生成主键值,用于标识记录的唯一性

④允许同时生成多个序列号,而每一个序列号是唯一的

⑤使用缓存可以加速序列的访问速度

2.序列的创建

(1)语法

CREATE SEQUENCE sequence

[START WITH integer]

[INCREMENT BY integer]

[MAXVALUE integer|NOMAXVALUE]

[MINVALUE integer|NOMINVALUE]

[CYCLE|NOCYCLE]

[CACHE integer|NOCACHE];

(2)参数

START WITH:设置序列的初始值,默认值为1

INCREMENT BY:设置相邻两个元素之间的差值,即步长,默认值为1

MAXVALUE:设置序列最大值

NOMAXVALUE:默认情况下,递增序列的最大值为10^28-1,递减序列的最大值为-1

MINVALUE:设置序列最小值

NOMINVALUE:默认情况下,递增序列的最小值为1,递减序列的最小值为-(10^27-1)

CYCLE:当序列达到其最大值或最小值后,开始新的循环

NOCYCLE:当序列达到其最大值或最小值后,序列不在生成值,默认选项

CACHE:设置Oracle服务器预先分配并保留在内存中的序列值的个数,默认为20

NOCACHE:不缓存序列值

(3)CACHE和NOCHACHE的区别 

如果指定CACHE值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。 cache里面的取完后,Oracle自动再

取一组到cache。使用cache或许会跳号, 比如数据库 突然不正常down掉(shutdown abort),cache中的Sequence就会丢失。 举

个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在 你重启数据库后,sequence的值将从

101开始。

如果指NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢

失。不过会产生一些问题:创建nocache sequence在高并发访问时,容易导致row cache lock等待事件,主要原因是每次获取

nextval时都需要修改rowcache中的字典信息。

(4)创建序列

定义序列seq_customers,产生客户编号,序列起始值为1,步长为1,不缓存,不循环。

create sequence seq_customers start with 1 increment by 1 nocache nocycle;

3.序列的使用

序列具有currval和nextval两个伪列。currval返回序列的当前值,nextval在序列中产生新值并返回此值。返回类型都是number类

型值。可以通过sequence_name.currval和sequence_name.nextval形式来应用序列。

可以在下列语句中使用序列的currval和nextval伪列

①select语句的目标列中

②insert语句的子查询的目标列中

③insert语句的values字句中

④update语句的set字句中

下列语句不允许使用序列的currval和nextval伪列

①对视图查询的select目标列中

②使用了distinct关键字的select语句中

③select语句中使用了group by、having或order by字句时

④在select、delete或update语句的子查询中

⑤在create table或alter table语句中的默认值表达式中

插入数据

insert into customers values(seq_customers.nextval,'王牧','83823422','[email protected]','北京','110010');

查询数据

select * from customers;

4.列序的修改

 可以利用alter sequence语句修改序列 注意事项:

①不能修改序列的start with参数

②如果要修改maxvalue参数,需要保证修改后的最大值大于序列的当前值(currval)

③序列的修改值影响以后生成的序列值

alter sequence seq_customers increment by 1 cache 5;

查询序列信息: 可以查询数据字典视图dba_sequences、all_sequence、user_sequences获取 序列信息

select * from user_sequences where sequence_name=’seq_customers’;

5.序列的删除

 当一个序列不再需要时,可以使用DROP SEQUENCE语句删除序列,对之前序列的应用没有任何影响。  

删除序列seq_customers drop sequence seq_customers; 

 

 

你可能感兴趣的:(Oracle,Oracle数据库,Oracle序列)