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 选择

特性SEQUENCEIDENTITY
版本全部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. 最佳实践

  1. IDENTITY:12c+ 表级
  2. CACHE 适当:性能
  3. RAC NOORDER:性能优先
  4. 跳号可接受:CACHE
  5. 避免触发器:IDENTITY 替代
  6. DEFAULT SEQUENCE:12c+ 灵活
  7. 监控使用:异常
  8. 业务连续性:考虑
  9. 测试:高并发
  10. 文档化:设计

14. 参考资料

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