Oracle 序列与自增列
Oracle 序列与自增列
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
序列与自增列方案[1]:
方式:
- SEQUENCE
- 12c IDENTITY
- 12c DEFAULT SEQUENCE
- 触发器(旧)
2. SEQUENCE
2.1 创建
CREATE SEQUENCE seq_emp_id
START WITH 1
INCREMENT BY 1
NOMAXVALUE
NOMINVALUE
NOCYCLE
CACHE 20
ORDER;
2.2 使用
-- nextval
INSERT INTO employees (id, name) VALUES (seq_emp_id.NEXTVAL, 'Alice');
-- currval(同会话 nextval 之后)
SELECT seq_emp_id.CURRVAL FROM dual;
2.3 修改
ALTER SEQUENCE seq_emp_id
INCREMENT BY 10
MAXVALUE 999999
CACHE 50;
2.4 删除
DROP SEQUENCE seq_emp_id;
3. CACHE 与性能
3.1 CACHE
-- 缓存到内存
CACHE 20 -- 默认 20
3.2 NOCACHE
-- 不缓存,慢但安全
NOCACHE
3.3 ORDER
-- RAC 严格有序
ORDER
3.4 性能
- CACHE 大:性能好,可能跳号
- CACHE 小:性能差
- RAC:ORDER 性能差
4. 12c IDENTITY 列
4.1 创建
CREATE TABLE employees (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR2(100)
);
4.2 BY DEFAULT
CREATE TABLE employees (
id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR2(100)
);
-- 允许显式指定
INSERT INTO employees (id, name) VALUES (100, 'Alice');
4.3 BY DEFAULT ON NULL
CREATE TABLE employees (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
name VARCHAR2(100)
);
-- NULL 时自动生成
INSERT INTO employees (id, name) VALUES (NULL, 'Alice');
4.4 选项
CREATE TABLE employees (
id NUMBER GENERATED ALWAYS AS IDENTITY
(START WITH 1 INCREMENT BY 1 CACHE 20)
PRIMARY KEY,
name VARCHAR2(100)
);
4.5 修改
ALTER TABLE employees MODIFY
(id GENERATED ALWAYS AS IDENTITY (CACHE 100));
5. 12c DEFAULT SEQUENCE
5.1 创建
CREATE SEQUENCE seq_emp_id;
CREATE TABLE employees (
id NUMBER DEFAULT seq_emp_id.NEXTVAL PRIMARY KEY,
name VARCHAR2(100)
);
-- 插入
INSERT INTO employees (name) VALUES ('Alice');
6. 触发器(旧方式)
6.1 创建
CREATE OR REPLACE TRIGGER trg_emp_id
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF :new.id IS NULL THEN
SELECT seq_emp_id.NEXTVAL INTO :new.id FROM dual;
END IF;
END;
/
6.2 缺点
- 性能差
- 维护复杂
- 推荐 IDENTITY
7. 序列查看
7.1 用户序列
SELECT sequence_name, min_value, max_value, increment_by, last_number
FROM user_sequences;
7.2 last_number
-- CACHE 模式下可能不准确
-- 实际下次值
SELECT seq_emp_id.NEXTVAL FROM dual;
8. 序列重置
8.1 增量法
-- 1. 查当前值
SELECT seq_emp_id.CURRVAL FROM dual;
-- 100
-- 2. 修改增量
ALTER SEQUENCE seq_emp_id INCREMENT BY -99;
-- 3. 取一次
SELECT seq_emp_id.NEXTVAL FROM dual;
-- 4. 还原
ALTER SEQUENCE seq_emp_id INCREMENT BY 1;
8.2 重建
DROP SEQUENCE seq_emp_id;
CREATE SEQUENCE seq_emp_id START WITH 1 INCREMENT BY 1;
9. 性能优化
9.1 CACHE 大小
-- 高并发
CACHE 1000
-- 普通
CACHE 20-100
-- 严格顺序
NOCACHE ORDER
9.2 RAC
-- 默认 NOORDER,每个节点独立 CACHE
-- 性能好,但可能跨节点乱序
-- ORDER 严格顺序
-- 性能差
9.3 监控
SELECT
sequence_name,
cache_size,
last_number
FROM user_sequences;
10. 跳号
10.1 原因
- CACHE 失效
- 实例重启
- RAC 节点失败
10.2 影响
- 业务上一般可接受
- 严格连续需要 NOCACHE
- 性能差
10.3 处理
-- 业务可接受:跳号
-- 严格:NOCACHE
11. 序列与 IDENTITY 选择
| 特性 | SEQUENCE | IDENTITY |
|---|---|---|
| 版本 | 全部 | 12c+ |
| 灵活 | 高 | 中 |
| 维护 | 多对象 | 表绑定 |
| 性能 | 相同 | 相同 |
| 推荐 | 复用 | 表级 |
12. 常见坑与排错
12.1 ORA-08004
-- 序列 NEXTVAL 在 CURRVAL 之前
SELECT seq_emp_id.CURRVAL FROM dual;
-- 先 NEXTVAL
12.2 ORA-02287
-- 序列不能用在 WHERE
SELECT * FROM t WHERE id = seq.NEXTVAL; -- 错误
12.3 跳号
- CACHE 失效
- 业务可接受
- 严格 NOCACHE
13. 最佳实践
- IDENTITY:12c+ 表级
- CACHE 适当:性能
- RAC NOORDER:性能优先
- 跳号可接受:CACHE
- 避免触发器:IDENTITY 替代
- DEFAULT SEQUENCE:12c+ 灵活
- 监控使用:异常
- 业务连续性:考虑
- 测试:高并发
- 文档化:设计
14. 参考资料
[1] Oracle Database SQL Language Reference 19c, “CREATE SEQUENCE” https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/CREATE-SEQUENCE.html