Oracle 序列(Sequence)概述
🔹 什么是序列(Sequence)?
Oracle Sequence(序列) 是一种数据库对象,用于生成唯一的递增或递减的数字序列。它通常用于 主键(Primary Key) 生成,避免手动管理 ID,提高插入数据的效率。
🔹 序列的作用
- 自动生成唯一值:避免手动输入 ID,防止重复值。
- 提高性能:减少并发冲突,避免
MAX(ID) + 1
的查询开销。 - 支持事务控制:即使事务回滚,已生成的序列号也不会回退,确保唯一性。
如何创建和使用序列
1️⃣ 创建序列
CREATE SEQUENCE my_seq
START WITH 1 -- 从 1 开始
INCREMENT BY 1 -- 每次递增 1
NOCACHE -- 不缓存,提高数据一致性
NOCYCLE; -- 生成的值不循环(达到最大值时报错)
参数解析:
START WITH 1
:指定序列从 1 开始。INCREMENT BY 1
:每次递增 1(可设为负数表示递减)。NOCACHE
:不预存值(默认CACHE 20
可提高性能)。NOCYCLE
:不允许达到最大值后重新从最小值开始。
2️⃣ 使用序列
(1)获取下一个序列值
SELECT my_seq.NEXTVAL FROM dual;
返回:
NEXTVAL
-------
1
每次 NEXTVAL
都会生成下一个唯一的值。
(2)用于 INSERT
语句
INSERT INTO employees (id, name) VALUES (my_seq.NEXTVAL, 'Alice');
这样,每次插入时 id
会自动增加。
3️⃣ 查看序列的当前值
查看当前序列的值(不增加)
SELECT my_seq.CURRVAL FROM dual;
注意: CURRVAL
只能在 NEXTVAL
之后使用,否则会报错。
4️⃣ 修改序列
如果需要修改序列,可以使用 ALTER SEQUENCE
:
ALTER SEQUENCE my_seq
INCREMENT BY 10 -- 修改增量为 10
CYCLE; -- 允许循环使用(达到最大值后从最小值重新开始)
5️⃣ 删除序列
DROP SEQUENCE my_seq;
✅ 适用场景
- 主键自动生成(如
id
字段) - 订单号、流水号管理
- 批量数据导入时确保唯一 ID
- 多用户并发插入时避免冲突
💡 总结
操作 | SQL 语法 |
---|---|
创建序列 | CREATE SEQUENCE my_seq START WITH 1 INCREMENT BY 1; |
获取下一个值 | SELECT my_seq.NEXTVAL FROM dual; |
获取当前值 | SELECT my_seq.CURRVAL FROM dual; |
修改序列 | ALTER SEQUENCE my_seq INCREMENT BY 5; |
删除序列 | DROP SEQUENCE my_seq; |