文档章节

oracle 序列

拷贝忍者卡卡习
 拷贝忍者卡卡习
发布于 2016/10/30 11:30
字数 1167
阅读 19
收藏 0

在许多的数据库之中都会存在一种自动增长列的概念。像 SQL Server、MySQL、DB2都提供有这样的数据类型,可是惟独在Oracle之中没有(Oracle12C之后提供了,之前没有),但是在Oracle之中提供的是一种手工的自动增长列控制,而这样的控制在Oracle之中使用序列(对象)完成。如果要想进行序列的创建,则要使用如下的语法:

CREATE SEQUENCE  序列名称

[INCREMENT BY 步长] [START WITH 开始值]

[MAXVALUE 最大值 | NOMAXVALUE]

[MINVALUE 最小值 | NOMINVALUE]

[CYCLE | NOCYCLE]

[CACHE 缓存大小 | NOCACHE]

如果用户直接使用“CREATE SEQUENCE序列名称”创建的是一个默认序列,默认序列的数值从1开始,每次增长1,而且没有最大值,最小值为1

 

范例:创建一个默认的序列

CREATE SEQUENCE myseq ;

既然序列属于数据库对象,那么所有的数据库对象一定要保存在数据字典之中,序列的数据字典应该查“user_sequences”数据字典:

SELECT * FROM user_sequences ;

在此数据字典之中主要包含如下列的数据信息:

· SEQUENCE_NAME:表示的序列名称,本处为 MYSEQ;

· MIN_VALUE:表示序列的最小值,默认的序列最小值是 1;

· MAX_VALUE:表示序列的最大值,默认序列是没有最大值,10 28 已经很大了。

· INCREMENT_BY:步长,每次增长的数据,默认的是 1;

· CYCLE:是否为循环序列,如果是 N 表示非循环,如果是 Y表示循环;

· ORDER:表示序列是否排序;

· CACHE_SIZE :序列的缓存数据;

· LAST_NUMBER :序列最后一次的增长值。

当一个序列对象已经创建完成之后,那么下面就可以采用如下的两个伪列来进行序列的控制:

· 取得序列下一个增长数据(每次调用序列值都增长指定的步长): 序列.nextval;

· 取得序列的当前数据(每次调用序列都不增长): 序列.currval;

·在使用 currval 之前一定要首先使用 nextval,否则会出现“ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义”。

范例:操作序列

SELECT myseq.nextval FROM dual ;

SELECT myseq.currval FROM dual ;

 

 

 

解释:关于 user_sequences 数据字典之中的 LAST_NUMBER 和 CACHE 的作用

首先必须明确的是,LAST_NUMBER 并不是当前序列真正增长的数据。

实际上当用户每次进行数据增长控制的时候,LAST_NUMBER 都表示已经处理完的一批序列内容,当当前序列的数值等于了 LAST_NUMBER 数据时,那么会自动再增加指定个“CACHE”大小的序列。

但是由于数据存在有缓存的问题,所以当数据库重新启动之后,那么所操作的序列就可能出现跳号的情况。如果想要避免跳号问题出现,那么最简单的做法是取消缓存,使用 NOCACHE 表示。

现在序列已经创建完成,而且也已经可以正常的进行使用了,可是该如何实现行的自动编号呢?只能够在数据增加的时候手工的进行控制。

 

范例:建立数据表,同时保存数据

DROP TABLE mytab PURGE ;

CREATE TABLE mytab(

mid NUMBER ,

title VARCHAR2(50) ,

CONSTRAINT pk_mid PRIMARY KEY(mid)

) ;



   INSERT INTO mytab(mid,title)

VALUES (myseq.nextval,'JAVA') ;

在开发之中只能够通过以上的方式实现序列的自动增长操作。

以上的序列创建方式是最为常用的一种方式,而现在也可以通过一些选项的控制,实现一些特殊的序列定义。

1,改变序列增长的步长

默认的序列步长是 1(INCREMENT BY 属性决定的)。

DROP SEQUENCE myseq ;

CREATE SEQUENCE myseq

INCREMENT BY 2 ;

此时每当调用 nextval 访问序列的时候,都会按照 2 进行数据的增长。

2 ,改变序列的开始值

默认的序列开始值是从 1 开始的,但是现在如果希望做一些定单的自动编号生成,则可以使用开始值设置一个较大的数据,这样处理定单编号就比较方便。

DROP SEQUENCE myseq ;

CREATE SEQUENCE myseq

INCREMENT BY 2

START WITH 10000000000000000000;

SELECT TO_CHAR(myseq.nextval,999999999999999999999)

3 ,循环序列

如果说现在希望序列的内容在:1、3、5、7、9 五个数据之间循环显示,那么就需要设置循环序列,而此时需要:

· 序列的最大值是 9;

· 序列的最小值是 1;

· 步长应该为 2。

DROP SEQUENCE myseq ;

CREATE SEQUENCE myseq

INCREMENT BY 2

START WITH 1

MAXVALUE 9 MINVALUE 1

CYCLE NOCACHE;

而利用此方式实际上就可以定义一些简单的抽奖的种子数据。

© 著作权归作者所有

拷贝忍者卡卡习
粉丝 10
博文 39
码字总数 24335
作品 0
深圳
程序员
私信 提问
Oracle序列使用:建立、删除

在开始讲解Oracle序列使用方法之前,先加一点关于Oracle client sqlplus的使用,就是如果执行多行语句的话一定要加“/”才能表示结束,并执行!本篇文章的主题是通过创建Oracle序列和触发器实...

teacheryang
2012/08/13
0
0
Oracle序列应用举例

序列是用来生成唯一、连续的整数的数据库对象。序列通常用来自动生成主键或唯一键的值。本篇文章的主题是通过创建Oracle序列和触发器实现表的主键自增。 1. 创建序列 Oracle序列的语法格式为...

博为峰教研组
2016/10/28
2
0
oracle 序列操作

oracle删除序列化: DROP SEQUENCE seqitvcollection; oracle创建序列化: CREATE SEQUENCE seqitvcollection INCREMENT BY 1 -- 每次加几个 START WITH 1399 -- 从1开始计数 NOMAXVALUE -- ......

teacheryang
2012/08/13
0
0
Oracle主键ID插入时自动增长(触发器)

需要 实现插入数据时,ID列自动增长 思路 创建一个Oracle自动增长序列,然后创建一个Oracle的触发器,当检查到插入该表数据时,这从序列里面取数据,作为自动增长id数据插入。 实现 创建序列...

亚林瓜子
2018/06/12
0
0
Oracle中序列的一些常用操作

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。 Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, CREATE SEQ...

zh119893
2013/05/18
116
0

没有更多内容

加载失败,请刷新页面

加载更多

Command模式

https://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html

南桥北木
40分钟前
0
0
由于PostgreSQL9.x二进制输出格式默认值改变导致的读取图片错误

今天从社区邮件看到一个这样的问题,感觉很有意思,在这分享给大家~具体如下: 问题现象: 作者有一个很老的Java应用,当时后端采用的PostgreSQL数据库版本为8.x,该系统除了正常的数据增删...

闻术苑
56分钟前
2
0
导入sql时出现Invalid default value for 'create_time'报错处理方法

当运行SQL会出现:[Err] 1067 - Invalid default value for 'create_time',是因为Mysql版本不同,如果版本不 < 5.6请去的话报错的处理方法如下: 方法 :alter table table_name modify cre......

writeademo
今天
1
0
对ssm(spring,springmvc,mybatis)的了解总结

ssm框架现在是java web开发的三个主流框架 ,其实严格来算只算是两个框架,因为springmvc属于spring框架 ,是spring的一个mvc子框架 那么我们下面就来了解一下三大框架把 一 .Spring spring...

咸鱼-李y
今天
2
0
聊聊Elasticsearch的FsProbe

序 本文主要研究一下Elasticsearch的FsProbe FsProbe elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/fs/FsProbe.java public class FsProbe { private static f......

go4it
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部