Oracle 序列(Sequence)与同义词(Synonym)

Oracle 序列(Sequence)与同义词(Synonym)

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


1. 概述

  • 序列(Sequence):生成唯一数字[1]
  • 同义词(Synonym):对象别名[2]

2. 序列

2.1 创建

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

2.2 参数说明

参数说明默认
START WITH起始值1
INCREMENT BY增量1
MAXVALUE最大值1E28
MINVALUE最小值1
CYCLE/NOCYCLE循环NOCYCLE
CACHE/NOCACHE缓存CACHE 20
ORDER/NOORDER顺序NOORDER

2.3 使用

-- 获取下一个值
SELECT seq_emp_id.NEXTVAL FROM dual;

-- 获取当前值
SELECT seq_emp_id.CURRVAL FROM dual;

-- 插入
INSERT INTO employees (id, name) 
VALUES (seq_emp_id.NEXTVAL, 'Alice');

2.4 修改

ALTER SEQUENCE seq_emp_id
  INCREMENT BY 10
  MAXVALUE 1000000
  CYCLE
  CACHE 50;

2.5 删除

DROP SEQUENCE seq_emp_id;

3. 序列缓存

3.1 CACHE 原理

1. 数据库缓存 N 个值到内存
2. NEXTVAL 从内存取
3. 缓存用完,再分配 N 个
4. 实例崩溃,缓存值丢失

3.2 CACHE 选择

场景CACHE说明
单实例低并发20默认
高并发100-1000减少 SQL
RAC100-1000ORDER 慎用
严格连续NOCACHE性能差

3.3 RAC ORDER

-- RAC 中保证全局有序
CREATE SEQUENCE seq_global
  CACHE 100
  ORDER;  -- 性能差

4. 序列间隙

4.1 原因

  • 实例崩溃
  • 回滚事务
  • 缓存丢弃

4.2 处理

  • 接受间隙(业务允许)
  • NOCACHE(性能差)
  • 触发器重试

5. 12c+ 标识列

5.1 GENERATED ALWAYS

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

-- 不能手动插入 ID
INSERT INTO employees (name) VALUES ('Alice');

5.2 GENERATED BY DEFAULT

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

-- 可手动指定
INSERT INTO employees (id, name) VALUES (100, 'Alice');
INSERT INTO employees (name) VALUES ('Bob');  -- 自动

5.3 GENERATED BY DEFAULT ON NULL

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

-- NULL 时自动生成
INSERT INTO employees (id, name) VALUES (NULL, 'Alice');

5.4 序列属性

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

6. 同义词

6.1 创建

-- 私有同义词
CREATE SYNONYM emp FOR scott.employees;

-- 公共同义词
CREATE PUBLIC SYNONYM emp FOR scott.employees;

-- 使用
SELECT * FROM emp;  -- 等价于 scott.employees

6.2 删除

DROP SYNONYM emp;
DROP PUBLIC SYNONYM emp;

6.3 查看

SELECT synonym_name, table_owner, table_name, db_link
FROM user_synonyms;

SELECT * FROM all_synonyms WHERE synonym_name = 'EMP';

7. 同义词用途

7.1 简化对象名

-- 长对象名
CREATE SYNONYM emp FOR hr.employees_master_archive;

-- 使用
SELECT * FROM emp;

7.2 跨模式访问

-- HR 模式访问 SCOTT 表
CREATE SYNONYM scott_emp FOR scott.employees;

-- 无需模式前缀
SELECT * FROM scott_emp;

7.3 跨数据库访问

-- 通过 DB Link
CREATE DATABASE LINK remote_db CONNECT TO user IDENTIFIED BY ****** USING 'remote';

CREATE SYNONYM remote_emp FOR employees@remote_db;

SELECT * FROM remote_emp;

7.4 应用解耦

-- 开发环境
CREATE SYNONYM emp FOR dev.employees;

-- 生产环境(仅改同义词)
CREATE OR REPLACE SYNONYM emp FOR prod.employees;

-- 应用代码不变
SELECT * FROM emp;

8. 公共同义词

8.1 创建

-- 需要 CREATE PUBLIC SYNONYM 权限
CREATE PUBLIC SYNONYM dual FOR SYS.DUAL;

-- 所有用户可访问
SELECT * FROM dual;

8.2 注意

  • 公共同义词全局可见
  • 与本地对象冲突时,本地优先
  • 谨慎使用

9. 同义词依赖

9.1 依赖视图

SELECT name, type, referenced_name, referenced_type
FROM user_dependencies
WHERE name = 'EMP';

9.2 重编译

-- 同义词自动失效
-- 重新使用时自动编译

10. 常见坑与排错

10.1 序列间隙

-- 正常现象
-- 业务接受
-- 或使用 NOCACHE

10.2 ORA-08004: 序列超出限制

-- 修复
ALTER SEQUENCE seq_emp_id MAXVALUE 10000000;
-- 或 CYCLE

10.3 ORA-02289: 序列不存在

-- 检查序列名
SELECT * FROM user_sequences;

10.4 ORA-00980: 同义词翻译无效

-- 同义词指向对象不存在
-- 检查
SELECT * FROM all_synonyms WHERE synonym_name = 'EMP';
-- 创建或修复指向

10.5 ORA-01031: 权限不足

-- 公共同义词需要权限
GRANT CREATE PUBLIC SYNONYM TO user;
GRANT DROP PUBLIC SYNONYM TO user;

11. 最佳实践

11.1 序列

  1. CACHE 提升性能:默认 20
  2. 高并发增 CACHE:100-1000
  3. RAC 慎用 ORDER:性能差
  4. 接受间隙:业务允许
  5. 12c+ 用 IDENTITY:替代触发器
  6. 命名规范:seq_xxx

11.2 同义词

  1. 简化对象名:易用
  2. 跨模式访问:解耦
  3. 应用解耦:环境切换
  4. 公共同义词谨慎:全局影响
  5. 命名规范:同义词名清晰

12. 参考资料

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

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