ORACLE-序列
2022-06-13
ORACLE-序列
背景:了解NEXTVAL的概念
ORACLE序列
概念
是oacle提供的用于产生一系列唯一数字的数据库对象。主要用于提供主键值。
sequence是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。**其主要的用途是生成表的主键值,可以在插入语句中引用,在插入之前,获取序列号nextval值,然后进行插入。**也可以通过查询检查当前值,或使序列增至下一个值。(https://www.jb51.net/article/220007.htm#/)
创建方式
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
CURRVAL
CURRVAL 中存放序列的当前值
SELECT INR_REQUIRMENT_SQUENCE.CURRVAL FROM dual
- 获取当前的sequence的值
CURRVAL = 最后一次对 NEXTVAL 的引用所返回的值
NEXTVAL
NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
select SEQ_TABLESPACETEST_con.nextval from dual
- 获取下一个值,序列经过查询每次也会自增
注意:
- 第一次访问序列时,需要先引用 sequence.NEXTVAL获取初始值。第一次在没有访问NEXTVAL前,是没有CURRVAL的。
- 后面每次引用 NEXTVAL,用已定义的 step 添加序列值并返回序列新的添加以后的值。
- 一个sql语句中只能生成一次nextval,就算调用多次,获取的也只有一个nextval
- nextval添加完的序列值不能取消,也就是说就算后面回滚当前事务,也不会还原。故:某些序列数可能被跳过
- 假设 sequence.CURRVAL 和 sequence.NEXTVAL 都出如今一个 SQL 语句中,则序列仅仅添加一次。在这样的情况下。每一个 sequence.CURRVAL 和 sequence.NEXTVAL 表达式都返回同样的值,无论在语句中sequence.CURRVAL 和 sequence.NEXTVAL 的顺序。
注意:要对序列使用 NEXTVAL 或 CURRVAL。必须对序列具有选择特权或对数据库具有 DBA 特权。