本文详细讲一下 序列(Sequence) 在 SQL 中的概念和使用方法。

1. 什么是序列(Sequence)?

序列是数据库中一种 独立于表的对象,它可以生成一系列 连续、唯一的数字,常用于生成主键值或其他需要唯一编号的场景。
特点包括:

  • 唯一性:每次生成的值都不会重复(除非手动重置)。
  • 自动递增或递减:可以指定步长(increment)。
  • 独立性:序列不依赖具体的表,可以被多个表共享。

简单理解:序列就像数据库中的“流水号生成器”。

2. 序列的创建

在 Oracle 中,创建序列的语法如下:

CREATE SEQUENCE 序列名
START WITH 1       -- 起始值
INCREMENT BY 1     -- 每次增加值
MINVALUE 1         -- 最小值
MAXVALUE 99999     -- 最大值
CACHE 20           -- 缓存数量,提高性能
NOCYCLE;           -- 达到最大值是否循环

示例:

CREATE SEQUENCE emp_seq
START WITH 1
INCREMENT BY 1
NOCYCLE;

这个序列每次生成一个递增的整数,从 1 开始,不循环。

3. 获取序列值

序列有两个常用伪列:

  1. NEXTVAL:获取下一个序列值,同时序列值增加。
  2. CURRVAL:获取当前序列值(必须先调用过 NEXTVAL)。
-- 获取下一个序列值
SELECT emp_seq.NEXTVAL FROM dual;

-- 获取当前序列值
SELECT emp_seq.CURRVAL FROM dual;

注意:dual 是 Oracle 中的一个虚拟表,用于 SELECT 表达式。

4. 在表中使用序列

常用于插入数据时自动生成主键:

INSERT INTO employees (emp_id, emp_name)
VALUES (emp_seq.NEXTVAL, '张三');

每次插入,emp_id 会自动使用序列生成的唯一值。

5. 序列的其他操作

  • 修改序列(如步长、缓存):
ALTER SEQUENCE emp_seq
INCREMENT BY 5;
  • 删除序列
DROP SEQUENCE emp_seq;

总结

  • 序列是生成唯一数字的工具,非常适合主键或流水号。
  • NEXTVAL 获取下一个值,CURRVAL 获取当前值。
  • 序列独立于表,灵活可复用。