理论教育 Oracle数据库管理与开发:序列的操作与注意事项

Oracle数据库管理与开发:序列的操作与注意事项

时间:2023-10-30 理论教育 版权反馈
【摘要】:③MAXVALUE指定序列的最大值,选项NOMAXVALUE是默认选项,代表没有最大值限制。例如,首次使用下面语句查询books_seq.nextval时,该序列被初始化。例如,9.1节中创建了books表。用序列值作为主键值时,不允许重复。因此,前面创建序列books_seq时采用NOCYCLE方式。但在调用ALTER SEQUENCE语句修改序列时应注意,序列的起始值不能修改。

Oracle数据库管理与开发:序列的操作与注意事项

序列(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。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈