Oracle里那些同义词和序列到底怎么用,简单说说基本操作和注意点
- 问答
- 2026-01-03 00:42:40
- 3
同义词和序列是Oracle数据库里两个挺有用的对象,它们本身不存什么实际的数据,但能帮你更方便、更高效地干活,下面就直接说说它们的基本操作和需要注意的地方。
先说同义词
你可以把同义词理解成一个对象的“别名”或者“快捷方式”,数据库里有一张表,名字特别长,叫HR_EMPLOYEES_BASE_INFO_TABLE,每次查询都要打这么长的名字,太麻烦了,这时候你就可以给它创建一个同义词,比如就叫EMP,以后你再查数据,直接用SELECT * FROM EMP;就行了,省时省力。
(来源:Oracle官方文档中关于同义词的基本概念)
同义词主要有两种:
- 私有同义词:这是你自己给自己创建的,只有你这个用户能看到和使用,创建语法很简单:
CREATE SYNONYM 同义词名 FOR 原来的对象名;,你登录的用户是SCOTT,你可以给自己创建一个:CREATE SYNONYM MYDEPT FOR SCOTT.DEPT;,这样你在SCOTT用户下,就能用MYDEPT来代替DEPT表了。 - 公有同义词:这种同义词是给数据库里所有用户用的,通常需要特殊的权限才能创建,一般由DBA(数据库管理员)来弄,创建语法是:
CREATE PUBLIC SYNONYM 同义词名 FOR 原来的对象名;,DBA创建了一个公有同义词:CREATE PUBLIC SYNONYM DEPARTMENTS FOR HR.DEPARTMENTS;,其他任何用户,只要有权访问HR.DEPARTMENTS表,就可以直接在自己的SQL语句里写SELECT * FROM DEPARTMENTS;,而不用管这个表到底属于哪个用户(HR),简化了写法。
(来源:Oracle官方文档中对PUBLIC和PRIVATE同义词的区分)
使用同义词要注意几点:

- 权限问题:创建同义词本身需要一个权限(CREATE SYNONYM或CREATE PUBLIC SYNONYM),但更重要的是,同义词只是一个“快捷方式”,你最终能不能访问它指向的那个真实对象,还得看你有没有对这个真实对象的操作权限(比如SELECT、INSERT权限),你不能通过一个同义词去访问一个你本来就没权限访问的表。
- 依赖关系:如果你创建了一个同义词指向某个表,后来这个表被删掉了(DROP掉了),那么你的同义词就变成了一个“无效”的快捷方式,这时候你再使用这个同义词,系统就会报错,说“对象不存在”,所以删除对象的时候要小心。
- 命名冲突:假如存在一个公有同义词叫
ABC,你自己又创建了一个私有同义词也叫ABC,那么在你自己的会话里,Oracle会优先使用你的私有同义词,这点要心里有数,避免混淆。
(来源:Oracle官方文档中关于同义词依赖性和名称解析顺序的说明)
再说序列
序列是用来生成一连串唯一数字的玩意儿,最常见的使用场景就是给表的主键字段自动生成值,比如你有一张订单表,需要一个唯一的、递增的订单号,用序列就再合适不过了。
(来源:Oracle官方文档中序列的用途介绍)

序列的基本操作很简单:
- 创建序列:
CREATE SEQUENCE 序列名;这是最简单的创建方式,它会从1开始,每次增加1,你也可以详细定义:CREATE SEONQENCE ORDER_SEQ START WITH 1000 INCREMENT BY 1 NOCACHE;意思是序列从1000开始,每次涨1,并且不缓存序列值(NOCACHE是为了避免序列号在数据库异常时出现间隔,下面会说到)。 - 使用序列:主要用两个“伪列”来获取值。
序列名.NEXTVAL:这是获取序列的下一个值,每调用一次,序列的值就会增加一次,这个值一旦被获取,就算你后续的事务回滚了,这个序列值也不会再回去了,这样就保证了唯一性,你可以在INSERT语句里用它:INSERT INTO ORDERS (ORDER_ID, ...) VALUES (ORDER_SEQ.NEXTVAL, ...);。序列名.CURRVAL:这是获取序列的当前值,也就是你最后一次调用NEXTVAL得到的那个值,注意,你必须先在一个会话里至少调用过一次NEXTVAL,才能使用CURRVAL。
(来源:Oracle官方文档中NEXTVAL和CURRVAL的用法说明)
使用序列要特别注意的地方:
- 序列间隙:这是最容易出问题的地方,序列产生的数字可能不是完全连续的,中间会有“空洞”,主要原因有:1) 事务回滚:你用了NEXTVAL拿到了一个值(比如5),但你的事务回滚了,这个5就被跳过去了,下一个拿到的是6,2) 系统故障:如果创建序列时使用了CACHE(缓存)选项,比如CACHE 20,数据库会一次性在内存里放20个序列值以提高性能,如果这时数据库突然重启,内存里这20个没来得及用的序列值就丢失了,下次再从序列取值就会跳过这20个,造成一个大的间隔,如果要求绝对连续,就不能用CACHE,但性能会受影响。
- 不能回滚:就像上面说的,NEXTVAL操作是独立于事务的,一旦生成就无法撤销,设计业务逻辑时要考虑到这一点。
- 非事务性:序列的递增不遵循事务的边界,多个事务可以同时获取不同的序列值,这些值可能会交织在一起。
(来源:Oracle官方文档中关于序列间隙的说明)
总结一下,同义词帮你简化对象访问,让SQL写起来更清爽,尤其是在跨用户访问时,序列则为你提供了一种高效、可靠的唯一数字生成机制,是主键自增的常用实现方式,用的时候,只要记着同义词的核心是“权限依赖”,序列的核心是“间隙问题”,就能避开大多数坑。
本文由歧云亭于2026-01-03发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/73393.html
