目录

15.2.1. 关于序列

15.2.2. 创建序列

15.2.3. 修改序列

15.2.4. 使用序列

15.2.5. 缓存序列号

15.2.6. 删除序列

您可以执行创建序列、修改序列、使用序列和删除序列等任务。

关于序列

序列是一种数据库对象,用来自动生成一组具有一定规律(增加或者减小)变化的连续不同序列号,一般应用于表的主键列。

创建序列

使用CREATE SEQUENCE语句创建序列。

修改序列

使用ALTER SEQUENCE语句修改序列。

使用序列

对用户而言,序列中的可用资源就是序列号,序列号可以被多个用户访问并递增或者递减。

序列信息的查询

序列作为一种数据库对象,其相关信息存储在数据字典中。

删除序列

如果不再需要某个序列,可以使用DROP SEQUENCE语句删除该序列。

父主题: 管理视图、序列和同义词

15.2.1. 关于序列

序列是一种数据库对象,用来自动生成一组具有一定规律(增加或者减小)变化的连续不同序列号。

序列一般应用于表的主键列,可以被多个用户使用,也可以为多个表生成主键。设想,如果没有序列,则只能编写程序生成顺序值,而在使用序列的情况下,当向表插入数据时,主键列就直接使用序列号赋值,保证了主键列没有重复值,也可以获得更可靠的主键值。

父主题: 管理序列

15.2.2. 创建序列

使用CREATE SEQUENCE语句创建一个序列。

要在模式中创建序列,您必须具有CREATE SEQUENCE系统权限。要在其他用户的模式中创建序列,必须具有CREATE ANY SEQUENCE的权限。 例如,下面的语句创建了一个序列,用于为student表的stu_nmb主键列生成四位数的学生编号:

CREATE SEQUENCE stu_sequence

INCREMENT BY 1

START WITH 1000

MINVALUE 1000

MAXVALUE 9999

CACHE 100

NOCYCLE;

通过上述例子可以看出,您可以通过各种选项参数实现对序列的控制,指示序列是升序还是降序、序列号的起始值(START WITH)、最小值(MINVALUE)和最大值(MAXVALUE)以及序列值之间的递增幅度(INCREMENT BY)等等。

其中NOCYCLE选项表示序列在达到最大值或最小值后不会生成更多值。如果希望序列号可以循环使用,请使用CYCLE选项。

CACHE子句预先分配100个序列号保存在内存中。用户每使用一次序列,都需要对序列进行一次查询,当保存在内存中可以大大加快获取序列号,当缓存中的最后一个序列号被使用时,数据库将向缓存读入另一组序列号。

如果选择缓存一组序列号,则数据库可能会跳过该组序列号。例如,当实例异常关闭时(例如,当发生实例故障或发出SHUTDOWN ABORT语句时),已缓存但未使用的序列号将丢失。此外,已使用但未保存的序列号也会丢失。

父主题: 管理序列

15.2.3. 修改序列

使用ALTER SEQUENCE语句修改序列。

要更改序列,您的模式必须包含该序列,您必须对该序列具有ALTER对象权限,或者必须具有ALTER ANY SEQUENCE系统权限。您可以通过修改序列的生成数值的定义参数来实现序列修改。

下面的例子改变了stu_sequence序列的增长幅度为2,循环使用序列号以及缓存数量变更为20:

ALTER SEQUENCE stu_sequence

INCREMENT BY 2

CYCLE

CACHE 20;

同时,您在修改序列的时候应注意到数值的合理性,比如下列语句则明显是不合理的,因为起始值(START WITH)是1000,而下列修改试图将最小值修改为2000:

ALTER SEQUENCE stu_sequence

INCREMENT BY 2

MINVALUE 2000

MAXVALUE 8000

CYCLE

CACHE 20;

父主题: 管理序列

15.2.4. 使用序列

对用户而言,序列中的可用资源就是序列号,序列号可以被多个用户访问并递增或者递减。

要使用序列,您的模式必须包含该序列,或者您必须已被授予其他用户序列的SELECT对象权限。一旦序列完成创建,序列就可以被多个用户(对包含该序列的序列拥有SELECT对象权限)访问和递增,而无需等待。

使用NEXTVAL生成序列号

序列一旦生成,用户就可以在SQL语句中用CURRVAL和NEXTVAL伪列来存取序列的值。

使用CURRVAL序列号

要使用当前序列值,请在SQL语句中引用seq_name.CURRVAL。

父主题: 管理序列

15.2.4.1. 使用NEXTVAL生成序列号

序列一旦创建,用户就可以使用SQL语句中从CURRVAL和NEXTVAL伪列中获取序列的值。

CURRVAL和NEXTVAL伪列就如同序列的指针一样,NEXTVAL每获得一个值,指针就向后移动一个位置,这是就可以用CURRVAL获取当前序列号。即,其意义如下:

CURRVAL 返回当前的序列值;

NEXTVAL 返回下一个可用的序列号。

如上描述,NEXTVAL和CURRVAL并不是保留字或关键字,可以在SELECT、INSERT或UPDATE等SQL语句中用作伪列名。在第一次使用序列号时,必须先访问NEXTVAL伪列。要生成和使用序列号,请引用SQL语句中的NEXTVAL,如下示例,从伪表dual中查看序列号:

SELECT stu_sequence.NEXTVAL FROM dual;

这条语句的执行结果为:

NEXTVAL

----------

2000

例如,假设有新的学生注册,序列号可以在值列表中直接引用:

INSERT INTO student VALUES (stu_sequence.NEXTVAL, '张丽',18,'高中二年级',2,'105@qq.com',SYSDATE);

当需要更新某位同学的序列号时,可以在UPDATE语句的SET子句中引用序列号。例如:

UPDATE student SET student_id = stu_sequence.NEXTVAL WHERE student_id = 2022;

父主题: 使用序列

15.2.4.2. 使用CURRVAL序列号

要使用当前序列值,请在SQL语句中引用seq_name.CURRVAL。

使用CURRVAL之前,seq_name.NEXTVAL必须在用户会话中已被引用(在当前或以前的事务中)至少一次。可以根据需要多次引用CURRVAL,包括在同一条语句中多次引用。在引用NEXTVAL之前,不会生成下一个序列号。继续前面的示例,您将通过插入新学生数据,进行注册:

INSERT INTO student VALUES (stu_sequence.CURRVAL, '刘意',17,'高中一年级',4,'106@qq.com',SYSDATE);

INSERT INTO student VALUES (stu_sequence.CURRVAL, '赵文',19,'高中一年级',5,'107@qq.com',SYSDATE);

假设上一节给出的INSERT语句生成了一个新的序号2022,那么本节中的语句插入的两行都插入了序号为2022的行。当然,如果引用CURRVAL的列定义了主键约束,此方法的引用会约束报错。

父主题: 使用序列

15.2.5. 缓存序列号

缓存序列号可以提高访问效率。

关于缓存序列号

在序列缓存中访问序列号比从磁盘读取序列号更快。

序列缓存中的条目数

当应用程序访问序列缓存中的序列时,将快速读取序列号。

缓存中的序列号数量

当序列被读入缓存时,指定数量的序列号就已经被生成并存储在缓存中。

父主题: 管理序列

15.2.5.1. 关于缓存序列号

在序列缓存中访问序列号比从磁盘读取序列号更快。序列缓存由条目组成,每个条目可以保存单个序列的多个序列号。

遵循这些指南快速访问所有序列号:

请确保序列缓存了足够的序列号,保证应用程序并发使用所有序列。 高并发情况应增加缓存中序列号的数量。

父主题: 缓存序列号

15.2.5.2. 序列缓存中的条目数

当应用程序访问序列缓存中的序列时,将快速读取缓存中的序列号。

如果应用程序访问的序列不在缓存中,那么在使用序列号之前,必须将序列先从磁盘读取到缓存中。 如果应用程序并发地使用许多序列,那么序列缓存可能不够大,不能容纳所有序列。在这种情况下,访问序列号可能经常需要读取磁盘。为了快速访问所有序列,请确保缓存中有足够数量的序列号,从而保证应用程序并发使用所有序列。

父主题: 缓存序列号

15.2.5.3. 缓存中的序列号数量

当序列被读入缓存时,指定数量的序列号就已经被生成并存储在缓存中。

然后可以快速地访问这些值。存储在缓存中的序列号的数量由CREATE SEQUENCE语句中的CACHE参数决定,该参数的默认值为1。 CREATE SEQUENCE语句创建seq_test2序列,该序列的50个值就存储在SEQUENCE缓存中:

CREATE SEQUENCE seq_test2

CACHE 50;

父主题: 缓存序列号

15.2.6. 删除序列

如果不再需要某个序列,可以使用DROP SEQUENCE语句删除该序列。

用户可以删除自己创建的任何序列。要在删除其他用户的序列,必须具有DROP ANY SEQUENCE系统权限。序列删除后,数据字典中不再保留相关信息。

例如,下面的语句删除了前面章节定义的stu_sequence序列:

DROP SEQUENCE stu_sequence;

父主题: 管理序列

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: