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 |
| RAC | 100-1000 | ORDER 慎用 |
| 严格连续 | 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 序列
- CACHE 提升性能:默认 20
- 高并发增 CACHE:100-1000
- RAC 慎用 ORDER:性能差
- 接受间隙:业务允许
- 12c+ 用 IDENTITY:替代触发器
- 命名规范:seq_xxx
11.2 同义词
- 简化对象名:易用
- 跨模式访问:解耦
- 应用解耦:环境切换
- 公共同义词谨慎:全局影响
- 命名规范:同义词名清晰
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