1.8 序列
序列是一种数据库对象,用来自动产生一组唯一的序号。序列是一种共享式的对象,多个用户可以共同使用序列中的序号。一般将序列应用于表的主键列,这样当向表中插入数据时,主键列就使用了序列中的序号,从而保证主键列的值不会重复。用这种方法可以代替在应用程序中产生主键值的方法,可以获得更可靠的主键值。
1.8.1 序列的创建、修改和删除
默认情况下,用户可以在自己的模式中创建序列。如果希望在其他用户的模式中创建序列,则必须具有CREATE ANY SEQUENCE这个系统权限。创建序列的命令为CREATE SEQUENCE,它的完整语法格式为:
CREATE SEQUENCE序列名INCREMENT BY n
START WITH n
MAXVALUE n|NOMAXVALUE
MINVALUE n|NOMINVALUE
CYCLE|NOCYCLE
CACHE n|NOCACHE
在这个命令的语法格式中,除序列名以外,其余各选项都是可选的。各选项中的n是一个整数。其中START WITH选项指定序列中的序号从哪个数字开始,默认情况下从它的最小值开始。INCREMENT选项指定了序列中序号递增的幅度,也就是后一个序号比前一个序号大多少。序号可以递增,也可以递减,所以INCREMENT选项中的数字n可以是正整数,也可以是负整数。
MAXVALUE用来指定序列中序号的最大值。如果没有最大值,可用NOMAXVALUE选项代替这个选项。同样,MINVALUE用来指定序列中序号的最小值,序列中的最小值必须小于或等于它的开始值。
如果为序列指定了最大值,那么当序列中的序号被消耗完时,用户将无法从这个序列中取得序号。选项CYCLE使得序列中的序号可以循环使用。当用户正在使用序列中的最大值时,下一个可以使用的序号就是它的开始值。
用户每使用序列一次,都要对序列进行一次查询。如果把序列中的序号放在内存中进行缓冲,那么用户获得序号的速度将大大加快。选项CACHE的作用就是将序列中接下来的n个序号在内存中进行缓冲。如果不希望进行缓冲,可以用NOCACHE选项代替它。
例如,下面的语句使用默认值创建了一个序列seq1:
SQL>CREATE SEQUENCE seq1;
下面的语句创建了一个序列seq2,它的开始值是100,增幅是2,最大值为10000,序列中的序号不在内存中进行缓冲。
SQL>CREATE SEQUENCE seq2
START WITH 10
INCREMENT BY 2
MAXVALUE 10000
NOCACHE;
序列的信息可以从数据字典user_sequences中获得。例如,下面的SELECT语句用于查询序列seq2的最小值、最大值、增幅、下一个可用序号、是否循环等信息:
SQL>SELECT min_value, max_value, increment_by, last_number, cycle_flag
FROM user_sequences
WHERE sequence_name='SEQ2'
MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER C
1 10000 2 10 N
序列在创建之后,在使用的过程中,可以对其进行修改。比如修改它的最大值、最小值、增幅等,但是不能修改开始值。需要注意的是,如果已经有部分序号被使用,那么对序列的修改只影响以后的序号,对以前已经使用的序号不起作用。
修改序列的命令是ALTER SEQUENCE。用户可以修改自己的序列,如果希望修改其他用户的序列,则需要具有ALTER ANY SEQUENCE这个系统权限。ALTER SEQUENCE命令的用法与CREATE SEQUENCE命令的用法基本相同。例如,下面的语句修改序列seq2的最小值、最大值、增幅,并使其中的序号可循环使用:
SQL>ALTER SEQUENCE seq2
MINVALUE 5
MAXVALUE 50000
INCREMENT BY 3
CYCLE;
现在重新执行上面的SELECT,查询这个序列的信息,查询结果为:
MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER C
5 50000 3 11 Y
删除序列的命令是DROP SEQUENCE。用户可以删除自己创建的序列,如果要删除其他用户的序列,则要具有DROP ANY SEQUENCE系统权限。序列被删除后,它的相关信息就被从数据字典中删除。例如,可用下面的语句删除序列seq2:
SQL>DROP SEQUENCE seq2;