Oracle序列(SEQUENCE)简介和使用

序列(SEQUENCE)简介

序列(SEQUENCE)是Oracle创建一个唯一的且等间距的数字序列,可作为表的主键

  • 不存在死锁和其他事务问题
  • 不能在CHECK约束中使用
  • 不能在视图查询、物化视图、子查询中使用
  • 不能使用DEFAULT关键字将列设置为自动递增

序列使用

创建

CREATE SEQUENCE sequence_name
[INCREMENT BY N]
[START WITH N]
[MAXVALUE N | NOMAXVALUE]
[MINVALUE N | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE N | NOCACHE];
  • sequence_name序列名称
  • INCREMENT BY N指定序列递增步长N,默认为1(N值可为负数)
  • START WITH N指定序列起始值,递增时默认是最小值,递减时默认为最大值
  • MAXVALUE N序列最大值
    • NOMAXVALUE表示不设置最大值(默认)
  • MINVALUE N序列最小值
    • NOMINVALUE表示不设置最小值(默认)
  • CYCLE表示序列达到最大或最小值后是否重新开始
    • NOCYCLE表示不循环
  • CACHE N表示序列预先内存缓存N个指定步长的序列(默认20)
    • 如果数据库存在异常重启或者刷新共享池(ALTER SYSTEM FLUSH SHARED_POOL) 会导致没有使用的缓存序列丢失,重新生成,存在序列跳号的情况
    • NOCACHE表示不缓存

使用

  • nextval返回序列下一个值
    • 注意 同一次SQL无论调用多少次 nextval 都不会产生序列的下一个值
  • currval序列当前值,应在nextval后使用,否则会提示 ORA-08002: 序列 XXX.CURRVAL 尚未在此会话中定义
--新建一个序列,起始值1000,步长1,不循环,内存缓存1000个序列
CREATE sequence seq_orders START WITH 1000 INCREMENT BY 1 minvalue 1 NOCYCLE cache 1000;

--获取序列下一个值
select seq_orders.nextval from dual;
--获取序列当前值
select seq_orders.currval from dual;

--同一SQL调用多次nextval获取序列下一个值都是同一个值
select seq_orders.nextval,seq_orders.nextval,seq_orders.nextval from dual;

 修改

ALTER SEQUENCE sequence_name 
INCREMENT BY N 
MAXVALUE N
CYCLE | NOCYCLE
CACHE N | NOCACHE;
  • 序列的初始值只能通过删除序列之后重建序列的方法实现

删除

DROP SEQUENCE sequence_name;
posted @ 2025-04-22 22:52  伊文小哥  阅读(206)  评论(0)    收藏  举报