序列是一种模式对象,多个用户可以用它来生成唯一整数。序列发生器提供高可扩展性的和性能良好的方法,来为数字数据类型生成代理键。
序列特征
序列定义需要如下所示的常规信息:
序列的名称
序列是升序还是降序
编号之间的间隔
数据库是否要在内存中缓存生成的序列号集合
当超限时序列是否要重复
下面的示例在示例模式 oe中创建序列 customers_seq。当向customers表中添加行时,应用程序可以使用此序列提供客户 ID 号。
CREATE SEQUENCE customers_seq
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
对customers_seq.nextval 的第一次引用会返回 1000。第二次引用返回 1001。每个后续引用的返回值比前一个引用大1。
对序列的并发访问
同一序列发生器可以为多个表生成编号。以这种方式,数据库可以自动生成主键,并协调跨多个行或表的键。例如,序列可以为orders表和customers表生成主键。
序列发生器可用于在多用户环境中生成唯一编号,不会引起磁盘I/O开销或事务锁定。例如,两个用户同时向orders表中插入新行。通过使用序列来为 order_id 列生成唯一编号,任何一个用户都不必等待别人输入下一个可用的订单号。序列自动为每个用户生成正确的值。
每个引用序列的用户都有权访问他或她的当前序列号,即在该会话中生成的最后一个序列值。用户可以发出一个语句生成一个新的序列号,或使用该会话最后生成的当前序列号。在某个会话中的一个语句生成了一个序列号后,只有该会话可以使用它。单个序列号可以跳过,如果个别序列号在某个事务中被生成使用,而最终被回滚,则它们会被跳过(而变得不连续)。
警告:
如果你的应用程序需要没有间隙的一组数字,则您不能使用 Oracle 序列。您必须在数据库中使用自己开发的代码来序列化你的程序行为。