Oracle/DM序列基本使用

序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。序列是一个计数器,它并不会与特定的表关联。通过创建Oracle序列和触发器实现表的主键自增。 序列的用途一般用来填充主键和计数。序列用于生成唯一、连续序号的对象、序列是可以升序、降序的。

sql 复制代码
#使用create sequence语句创建序列
SQL>CREATE SEQUENCE stu_seq
    START WITH 1
    INCREMENT BY 1
    MAXVALUE 1
    MINVALUE 1
    NOCYCLE       1   #在达到最大值后停止生成下一个值
    CACHE 10      #  指定内存中预先分配的序号数
  • INCREMENT BY 用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的。
  • START WITH 定义序列的初始值(即产生的第一个值),默认为1。
  • MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
  • MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。
  • CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。
  • CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。**对序列进行内存缓冲,可以改善序列的性能。**CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。 缓存选项会造成数据丢失,当实例异常关闭时
sql 复制代码
# 创建序列
CREATE SEQUENCE SEQ_BATCH_CODE INCREMENT BY 1 START WITH 1 MAXVALUE 9999 CYCLE NOCACHE;
CREATE SEQUENCE SEQ_PAPER_CODE INCREMENT BY 1 START WITH 1 MAXVALUE 999 CYCLE NOCACHE;
CREATE SEQUENCE SEQ_ORG_CODE INCREMENT BY 1 START WITH 1 MAXVALUE 999 CYCLE NOCACHE;
# 删除序列:
DROP SEQUENCE SEQ_BATCH_CODE;

#查询当前用户的序列
select * from user_sequence;

#通过序列的伪列来访问序列的值
NEXTVAL  返回序列的下一个值
CURRVAL   返回序列的当前值
第一次使用序列对象不能返回序列当前值,只能返回序列的下一个值

SQL>select stu_seq.nextval from dual;

序列的用法
create table student (
    sno number(4),
    sname varchar(2)
);

SQL>insert into student values(stu_seq.nextval,'xiaoming');
SQL>insert into student values(stu_seq.nextval,'hunglong');


# 步骤1:产生序列的第一个值.
SELECT SEQ_BATCH_CODE.NEXTVAL FROM DUAL;

# 步骤2:产生序列的下一个值.
SELECT SEQ_BATCH_CODE.NEXTVAL FROM DUAL;

# 产生序列的当前值.
SELECT SEQ_BATCH_CODE.CURRVAL FROM DUAL;

# 查看序列
# 同过数据字典USER_OBJECTS可以查看用户拥有的序列.
# 通过数据字典USER_SEQUENCES可以查看序列的设置.

SELECT SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY,LAST_NUMBER FROM USER_SEQUENCES; 

# 更改(Alter)Sequence
ALTER SEQUENCE seq02
INCREMENT BY 20
MAXVALUE 100000
CYCLE;
Sequence 原理

Oracle用Sequence来按需提供(几乎)无限的数字序列,这些序列保证是唯一的。最简单的方法就是保持一个全局可见的计数器,并在每次查询sequence_name.nextval的值时递增。

但Oracle必须跟踪提供的最后一个数字,以避免两次提供相同数字的风险------这对数据库系统来说很容易:只需将最新的数字保存在表中即可。然而,如果每次有人需要下一个号码时都必须更新一个表格,这流程会非常缓慢。这时应该使用一个自主事务,这样就不需要等待第一个会话提交其当前事务,然后才能生成下一个数字。因此,Oracle使用递归的、自主的事务来处理表更新,并且它通过在内存中计数并记住下一次需要更新表的时机来避免每次调用nextval都更新表。

自制"序列的一种常见策略是,在一个表中包含(序列名,最近使用的序列号)的列,然后编写一个函数,从表中选择相关行进行更新,增加编号,更新表,并将编号提供给最终用户,这正是Oracle内在的机制。

相关推荐
jnrjian13 分钟前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
TTc_2 小时前
oracle中的union和union all有什么区别?
数据库·oracle
山峰哥3 小时前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器
南 阳6 小时前
Python从入门到精通day37
数据库·python·oracle
轩情吖7 小时前
MySQL库的操作
android·数据库·mysql·oracle·字符集·数据库操作·编码集
脱发的老袁9 小时前
【数据库】Oracle手动清理归档日志
数据库·oracle
jnrjian9 小时前
Oracle 共享池 库缓存下的 Library Cache Lock
数据库·缓存·oracle
新缸中之脑1 天前
在Reddit上探索未满足的需求
数据库·oracle
light blue bird1 天前
产线多并发客户端指令操作场景组件
jvm·oracle·.net·winform
坐吃山猪1 天前
Neo4j04_数据库事务
数据库·oracle·neo4j