Oracle中序列(Sequence)是一种用于生成唯一递增整数的数据库对象,常用于主键值的自动生成,可避免冲突并提升性能。
一、序列的核心特性- 唯一性:生成的数值严格递增,确保不重复。
- 灵活性:支持自定义起始值、步长、最大值/最小值、循环规则及缓存大小。
- 性能优化:通过缓存(CACHE)减少数据库访问次数。
二、创建序列的语法CREATE SEQUENCE sequence_name START WITH start_value INCREMENT BY increment_value [MAXVALUE max_value | NOMAXVALUE] [MINVALUE min_value | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE size | NOCACHE];参数说明:
- START WITH:序列初始值(默认为1)。
- INCREMENT BY:步长(正数递增,负数递减,默认为1)。
- MAXVALUE/MINVALUE:序列上下限(可选)。
- CYCLE/NOCYCLE:是否循环(达到极限后从头开始或报错)。
- CACHE:预分配数值数量(默认20,NOCACHE禁用缓存)。
三、使用序列的方法获取下一个值并递增
SELECT sequence_name.NEXTVAL FROM DUAL;首次调用NEXTVAL会初始化序列并返回起始值。
后续调用每次返回当前值+步长。
获取当前值(不递增)
SELECT sequence_name.CURRVAL FROM DUAL;需先执行过NEXTVAL才能使用CURRVAL。
在INSERT语句中使用
INSERT INTO table_name (id, column1) VALUES (employee_id.NEXTVAL, 'value');
四、实际应用示例1. 创建序列CREATE SEQUENCE employee_id START WITH 100 INCREMENT BY 2 MAXVALUE 999 NOCYCLE CACHE 10;- 从100开始,每次增加2,最大值999,不循环,缓存10个值。
2. 使用序列插入数据-- 获取下一个序列值SELECT employee_id.NEXTVAL FROM DUAL; -- 返回100-- 插入数据时自动使用序列INSERT INTO employees (id, name) VALUES (employee_id.NEXTVAL, 'John');五、注意事项- 会话隔离性:CURRVAL仅在当前会话中有效,不同会话的序列值独立。
- 性能权衡:缓存(CACHE)提升速度,但可能因实例故障丢失未使用的序列值。
- 删除序列:DROP SEQUENCE sequence_name;
六、序列的优势- 避免主键冲突:自动生成唯一值,尤其适合高并发插入场景。
- 简化开发:无需手动维护主键计数器。
- 事务无关性:序列生成与事务提交/回滚无关,即使回滚事务,序列值也不会重置。
通过合理使用序列,可以显著提升数据库操作的效率和可靠性。