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 NULL | NULL 时生成 |
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. 最佳实践
- IDENTITY(12c+):推荐
- CACHE 20-100:性能
- NOCYCLE:避免重复
- RAC NOORDER:性能
- NOMAXVALUE:避免满
- 重置谨慎:数据
- 接受 GAP:业务
- 批量插入:高效
- 监控:使用
- 文档化:设计
12. 参考资料
[1] Oracle Database SQL Language Reference 19c, “CREATE SEQUENCE” https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/CREATE-SEQUENCE.html