Oracle 序列(Sequence)概述

🔹 什么是序列(Sequence)?

Oracle Sequence(序列) 是一种数据库对象,用于生成唯一的递增或递减的数字序列。它通常用于 主键(Primary Key) 生成,避免手动管理 ID,提高插入数据的效率。

🔹 序列的作用

  1. 自动生成唯一值:避免手动输入 ID,防止重复值。
  2. 提高性能:减少并发冲突,避免 MAX(ID) + 1 的查询开销。
  3. 支持事务控制:即使事务回滚,已生成的序列号也不会回退,确保唯一性。

如何创建和使用序列

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;

🚀 使用 NEXTVAL 插入数据,避免手动管理 ID,让数据库更高效!