Oracle 序列与自增列详解

Oracle 序列与自增列详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

序列生成唯一数字,常用于主键[1]:

详细见:Oracle 序列与自增列


2. 序列

2.1 创建

CREATE SEQUENCE emp_seq
  START WITH 1
  INCREMENT BY 1
  NOMAXVALUE
  NOMINVALUE
  NOCYCLE
  CACHE 20
  NOORDER;

2.2 参数

参数说明
START WITH起始值
INCREMENT BY步长
MAXVALUE最大值
NOMAXVALUE无最大(默认)
MINVALUE最小值
NOMINVALUE无最小(默认)
CYCLE循环
NOCYCLE不循环(默认)
CACHE n缓存 n(默认 20)
NOCACHE不缓存
ORDER保证顺序
NOORDER不保证(默认)

2.3 使用

-- NEXTVAL
INSERT INTO employees (id, name) VALUES (emp_seq.NEXTVAL, 'Alice');

-- CURRVAL
SELECT emp_seq.CURRVAL FROM dual;
-- 注意:CURRVAL 必须先 NEXTVAL

-- 表达式
SELECT emp_seq.NEXTVAL FROM dual;

2.4 12c+ 直接使用

-- 序列默认
CREATE TABLE employees (
  id NUMBER DEFAULT emp_seq.NEXTVAL PRIMARY KEY,
  name VARCHAR2(100)
);

INSERT INTO employees (name) VALUES ('Alice');
-- id 自动填充

3. 自增列(12c+)

3.1 IDENTITY

CREATE TABLE employees (
  id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR2(100)
);

-- BY DEFAULT
CREATE TABLE employees (
  id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR2(100)
);

-- ON NULL
CREATE TABLE employees (
  id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
  name VARCHAR2(100)
);

3.2 区别

类型说明
ALWAYS总是生成(不可指定)
BY DEFAULT默认生成(可指定)
ON NULLNULL 时生成

3.3 选项

CREATE TABLE employees (
  id NUMBER GENERATED ALWAYS AS IDENTITY 
    (START WITH 1 INCREMENT BY 1 MAXVALUE 999999 CACHE 20)
    PRIMARY KEY,
  name VARCHAR2(100)
);

3.4 修改

ALTER TABLE employees MODIFY 
  id GENERATED ALWAYS AS IDENTITY (START WITH 1000);

ALTER TABLE employees MODIFY 
  id GENERATED BY DEFAULT AS IDENTITY;

3.5 删除

ALTER TABLE employees MODIFY id DROP IDENTITY;

4. 序列管理

4.1 修改

ALTER SEQUENCE emp_seq
  INCREMENT BY 1
  MAXVALUE 999999
  CACHE 50;

-- 重置(需重建或 INCREMENT)
ALTER SEQUENCE emp_seq INCREMENT BY -100;  -- 暂时
SELECT emp_seq.NEXTVAL FROM dual;
ALTER SEQUENCE emp_seq INCREMENT BY 1;

4.2 删除

DROP SEQUENCE emp_seq;

4.3 查看

SELECT sequence_name, min_value, max_value, increment_by, cycle_flag, cache_size, last_number
FROM user_sequences;

5. CACHE

5.1 CACHE

- 内存缓存
- 性能
- 重启可能跳号

5.2 NOCACHE

- 每次磁盘
- 不跳号
- 性能低

5.3 推荐

- OLTP:CACHE 20-100
- 批量:CACHE 1000+
- 关键:NOCACHE

6. RAC

6.1 ORDER

CREATE SEQUENCE emp_seq ORDER;
-- 保证 RAC 节点间顺序
-- 性能影响

6.2 NOORDER

CREATE SEQUENCE emp_seq NOORDER;
-- 不保证顺序
- 性能好

7. 应用场景

7.1 主键

CREATE TABLE employees (
  id NUMBER DEFAULT emp_seq.NEXTVAL PRIMARY KEY,
  name VARCHAR2(100)
);

INSERT INTO employees (name) VALUES ('Alice');

7.2 单号

CREATE SEQUENCE order_seq START WITH 1000001;

INSERT INTO orders (order_no, ...) VALUES (order_seq.NEXTVAL, ...);

7.3 IDENTITY

CREATE TABLE employees (
  id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR2(100)
);

8. 性能

8.1 CACHE

- 减少磁盘 I/O
- 推荐 CACHE

8.2 RAC

- NOORDER:性能
- ORDER:顺序
- 选择

8.3 批量

-- 批量插入
INSERT INTO employees (id, name) 
SELECT emp_seq.NEXTVAL, name FROM temp_emp;

9. GAP

9.1 跳号原因

- CACHE 重启
- 事务回滚
- 异常

9.2 处理

- 接受
- 重要场景 NOCACHE
- 业务无影响

10. 常见坑与排错

10.1 ORA-08004

- 序列超 MAXVALUE
- CYCLE 或增大 MAX

10.2 ORA-02287

- 不可用位置
- 检查

10.3 ORA-04013

- CACHE 过大
- 调整

11. 最佳实践

  1. IDENTITY(12c+):推荐
  2. CACHE 20-100:性能
  3. NOCYCLE:避免重复
  4. RAC NOORDER:性能
  5. NOMAXVALUE:避免满
  6. 重置谨慎:数据
  7. 接受 GAP:业务
  8. 批量插入:高效
  9. 监控:使用
  10. 文档化:设计

12. 参考资料

[1] Oracle Database SQL Language Reference 19c, “CREATE SEQUENCE” https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/CREATE-SEQUENCE.html