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;