序列(sequence)是一种共享式的数据库对象,用来自动产生一组多个用户都可以使用的整数序号。一般序列应用于表的主键列,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值实现。
(1)创建序列
创建序列的命令为CREATE SEQUENCE,其完整语法格式为:
CREATE SEQUENCE[模式名.]序列名
[INCREMENT BY{1|n}]
[START WITH n]
[MAXVALUE n|NOMAXVALUE]
[MINVALUE n|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE n|NOCACHE]
[ORDER|NOORDER];
其中:
①INCREMENT BY定义序列递增的步长,默认为1。如果n是正值,则代表序列值是按照步长n递增;如果n是负值,则代表序列值是按照步长n递减。
②STARTWITH指定序列的起始值,默认为1。
③MAXVALUE指定序列的最大值,选项NOMAXVALUE是默认选项,代表没有最大值限制。
④MINVALUE指定序列的最小值,选项NOMINVALUE是默认选项,代表没有最小值限制。
⑤CYCLE和NOCYCLE指定该序列在达到最大值或最小值后是否循环,CYCLE代表循环,NOCYCLE代表不循环;如果循环,则当递增序列达到最大值时,循环到最小值;当递减序列达到最小值时,循环到最大值;如果不循环,达到限制值后,继续产生新值就会发生错误。
⑥CACHE和NOCACHE指出数据库是否在内存中预分配一定数量的序列值进行缓存。用户每使用序列一次,都要对序列进行一次查询,因此预分配序列值可以加快访问速度,提高性能;参数n的最小值是2,其默认值是20;对于循环序列,缓存的序列值数量一定要小于该序列循环的值数量,因此可以缓存的序列值个数最多为:
CELL(MAXVALUE⁃MINVALUE)/ABS(INCREMENT)
⑦ORDER和NOORDER指出是否确保按照请求顺序生成序列号,默认为NOORDER。
例如,以scott用户连接到数据库后,创建序列books_seq,初始值为10,递增步长为1,最大值是999 999。
又如,下面语句创建序列orders_seq,它从100 000开始计数,增量为-5。(www.daowen.com)
(2)查看序列
序列的信息可以从数据字典user_sequences中获得。
例如,下面的SELECT语句用于查询序列books_seq的最小值、最大值、增幅、下一个可用序号、是否循环等信息。
(3)使用序列
序列创建成功之后,可以通过序列的两个属性——currval和nextval来引用序列的值,它们分别用来获取序列的当前值和下一个值。调用方式为:
序列名.nextval/currval
在首次查询序列的当前值之前,必须通过查询序列的下一个值对序列进行初始化。
例如,首次使用下面语句查询books_seq.nextval时,该序列被初始化。
如果未初始化,则不能使用currval来获取该序列的当前值。经过上述初始化之后,就可以使用currval来获取该序列的当前值。
在Oracle数据库内,序列常常被用于为表的主键列提供列值。
例如,9.1节中创建了books表。下面,向books表中插入数据时,即可使用前面创建的books_seq序列来为bookid赋值。
上面语句向表books中插入第1条数据时,使用的是books_seq.currval对bookid列进行赋值。如果继续向表books中插入数据,则应该使用books_seq.nextval让序列产生下一个序列值,对bookid列赋值,保证主键列值的唯一性。
经过上面的插入操作,表books中已经有3条记录,下面查询该表的数据,即可看到序列产生的主键值。
用序列值作为主键值时,不允许重复。因此,前面创建序列books_seq时采用NOCYCLE方式。
(4)修改序列
序列建立后,可以使用ALTER SEQUENCE语句进行修改,该语句的语法格式与CREATE SEQUENCE基本一致,这里不再重复列出。
例如,下面语句把上面创建的序列orders_seq修改为递增序列。
但在调用ALTER SEQUENCE语句修改序列时应注意,序列的起始值不能修改。
(5)删除序列
删除序列的命令是DROP SEQUENCE语句。例如,下面语句删除前面创建的序列orders_seq。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。