在Oracle数据库中,序列(Sequence)是一个数据库对象,它提供了一个自动递增的整数序列。序列通常用于生成表中的主键值或其他需要唯一标识符的列。使用序列可以简化开发工作,并确保生成的值是唯一的和连续的。
序列的作用
- 生成唯一标识:最常见的用途是为表的主键字段提供唯一值。
- 提高性能:与自增长字段相比,序列可以在并发环境中更高效地生成唯一值。
- 灵活性:可以根据需要调整序列的增长方式,例如设置步长、最大值等。
创建序列
要创建一个序列,可以使用CREATE SEQUENCE
语句。以下是一些常用的选项:
INCREMENT BY n
:指定序列每次增加的数值,默认为1。START WITH n
:指定序列的第一个值。MAXVALUE n
或NOMAXVALUE
:指定序列的最大值,或没有最大值。MINVALUE n
或NOMINVALUE
:指定序列的最小值,或没有最小值。CYCLE
或NOCYCLE
:指定当达到最大值或最小值时是否循环。CACHE n
或NOCACHE
:指定缓存多少个序列号以提高访问速度,或不缓存。
例子
CREATE SEQUENCE my_sequence
START WITH 1
INCREMENT BY 1
MAXVALUE 999999999
MINVALUE 1
NOCYCLE
CACHE 20;
使用序列
一旦创建了序列,就可以通过CURRVAL
和NEXTVAL
伪列来访问当前值和下一个值。
NEXTVAL
:返回序列中的下一个值。首次调用NEXTVAL
会返回START WITH
指定的值。CURRVAL
:返回序列的当前值。必须先调用过NEXTVAL
才能获取CURRVAL
。
插入数据时使用序列
-- 假设有一个表叫做 employees
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (my_sequence.NEXTVAL, 'John', 'Doe');
查询序列的当前值
SELECT my_sequence.CURRVAL FROM DUAL;
注意:在查询CURRVAL
之前,必须至少调用一次NEXTVAL
,否则会报错。
修改序列
如果需要修改已存在的序列,可以使用ALTER SEQUENCE
语句。例如,改变增量步长:
ALTER SEQUENCE my_sequence INCREMENT BY 2;
删除序列
如果不再需要某个序列,可以使用DROP SEQUENCE
语句将其删除:
DROP SEQUENCE my_sequence;
注意事项
- 在高并发环境下,序列可能会产生间隙(gaps),因为某些事务可能被回滚,而已经分配出去的序列值不会被重用。
- 如果设置了
CACHE
选项,那么在系统崩溃的情况下,缓存在内存中的序列值可能会丢失,从而导致更大的间隙。 - 如果设置了
CYCLE
选项,那么当序列达到最大值后会重新从最小值开始计数。如果没有设置CYCLE
,则到达最大值后将不能再获取新的值。
通过合理地配置和使用序列,可以有效地管理数据库中的唯一标识符,同时保证系统的稳定性和效率。