前言:

做过web开发的人员基本上都知道,数据库表中的主键值有的时候我们会用数字类型的并且自增。这样mysql、sql server中的都可以使用工具创建表的时候很容易实现。但是oracle中没有设置自增的方法,一般情况我们会使用序列和触发器来实现主键自增的功能。下面这面文章主要介绍序列。

一、什么是序列

序列: Sequence 是oracle提供的用于产生一系列唯一数字的数据库对象。由于oracle中没有设置自增列的方法,所以我们在oracle数据库中主要用序列来实现主键自增的功能。

二、怎么样创建序列

三、如何使用序列

序列创建后,可以使用序列的NEXTVAL来获取序列的下一个值,使用CURRVAL来查看当前值。第一次使用必须先使用NEXTVAL来产生一个值后才可以使用CURRVAL进行查看。

四、创建序列示例

4.1 最简单的序列示例

执行这个创建语句会在数据库中产生一个名字为seq_test的序列对象,其它的参数都会默认使用默认值。查看生成的源码如下:

当你调用seq_test这个序列时,它会为你产生从1到999999999999999999999999999的连续递增数值,从1开始,每次增量为1,不循环产生。产生最大值后将无法使用。默认使用缓存生成,每次缓存的数量为20个。关于缓存我们后面再讲。

4.2 创建有最大值的非循环序列

这个序列虽然设置最小值为5,但由于开始值为10,并且不循环产生,所以不会产生10以下的数值。需要注意的是,序列的起始值不能小于最小值,否则创建序列会报错。我们把上面代码改成如下:

当我们执行序列提取到最大值300时,序列会从最小值5开始重新循环生成。而此序列第一次是从开始值生成。

需要注意的是,如果我们创建一个循环序列,则必须要设定最大值,否则会报错:

五、使用带缓存的序列

创建序列时使用CACHE能提高性能,特别是在高并发的情况下对数据库的性能提升还是不错的。但是使用缓存会有产生断号的现象,如果你的业务要求序列产生的值必须是连续的,那就只能使用nocache了。

我们先来了解一下cache这个参数的作用。cache,它的用处是缓存指定个数的序列值。比如你设置的 cache 是20,那么在获取 nextval 时,Oracle 会直接从 cache 中取下一个序列值,如果 cache 中缓存的序列值没有了(比如 cache 中的序列值用完了,或者被手工清空了),那么 Oracle 会再次产生20个序列值,并放置 cache 中供使用,这样有助于提高序列值的获取速度。

我们下面通过一个案例来演示一下缓存的作用:

此时执行SEQ_CACHE.nextval 会返回产生第一个值1。调用SEQ_CACHE.currval 查看当前值为1。

当我们第一次调用nextval时,由于设置了缓存数为20,序列会一次生成20个数值放在缓存里。当我们再次调用nextval时其实是从缓存里取到的值。假如我们此时将缓存清空再调用nextval,我们来测试一下。

发现获取的值是21而不是2 。因为缓存里的值被清空了,所以系统会自动又获取20个新的连续值放在缓存里。

我们现在再执行四次nextval,会得到当前的值为25。此时我们再次清空缓存,然后再次调用nextval来获取序列。

我们会得到当前的值为41。为什么呢?因为每次oracle获取20值是从上次获取的最大值开始的,而不是从当前值开始计算的!使用缓存会产生产生的数字不连接的风险,如果系统出异常或oracle重启则系统会清空缓存的数据,当调用nextval时会重新获取相应缓存设置的数量的值。

我们再来看一个带缓存的案例:

为什么会出现这样的错误呢?

我们缓存设定的值是 50,而最大值是 300,那么为什么还会提示这样的信息呢? 其实我们的 cache 虽然是 50,但是我们每次增长值是 10。这样 50 次缓存提取出的数是 500 (50*10),我们每次循环的最大值是300,所以就提示我们一次获取的缓存值必须小于一次循环产生的最大值。

我们将代码修改如下:

这又是为什么呢?我们一次循环的最大值已经设置成500了,为什么还有这样的错误提示?这是因为还存在一个 minvalue ,minvalue 和 maxvalue 之间是 490 个数,也就是一次循环可以提取 490,但是我们的缓存是500。

我们将代码修改如下:

发现创建序列成功。在创建序列的时候关于缓存值的设置我们有一个基本的公式要求:

最大值最小值缓存值每次循环的值

只要满足这个公式的缓存值设置就没有问题。

总结:

通过上述我们发现使用序列有几个基本的约束条件,总结有以下几条:

1、序列第一次必须先调用nextval获取一个序列值才能使用currval查看当前值

2、序列的起始值不能小于最小值

3、创建一个循环序列,则必须要设定最大值

4、如果创建带缓存的序列,缓存的值必须满足约束公式: 最大值-最小值>=(缓存值-1)*每次循环的值

以上是对oracle数据库的序列的详细介绍,希望能对大家理解和掌握序列的使用有所帮助。

oracle数据库主键自增序列_Oracle数据库序列详解相关推荐

  1. oracle数据库主键自增序列_oracle数据库ID自增长--序列

    什么是序列?在mysql中有一个主键自动增长的id,例如:uid number primary key auto_increment;在oracle中序列就是类似于主键自动增长,两者功能是一样的,只是 ...

  2. oracle数据库主键自增序列_Oracle数据库主键自增

    Oracle数据库主键自增 在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增.下面 ...

  3. oracle数据库主键自增序列_【oracle】oracle数据库建立序列、使用序列实现主键自增...

    2.建立序列 -- Create sequence create sequence SEQ_SHIP_IMAGE minvalue 20 maxvalue 999999999999999999 sta ...

  4. Oracle数据库主键自增

    Oracle数据库主键自增 在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增.下面 ...

  5. Navicat:设置Oracle数据库主键自增

    一. 创建如下表 Oracle数据库不同于Mysql.Sql Server数据库,Oracle数据库主键自增不能在建表时直接设置,而是需要通过序列和触发器进行设置! 二.创建序列 create seq ...

  6. Mybatis使用Oracle数据库主键自增

    一.关于mysql和oracle主键自增 我们知道在mysql中主键设置为int类型,然后设置AUTO_INCREMENT,则在插入数据的时候mapper中的sql文件是可以不写主键这个字段,数据库就 ...

  7. oracle数据库主键消失,oracle数据库提示找不到主键

    @杨泽 public class Info { @AssignID String node; String name; } infoDao.single("000001"); or ...

  8. oracle中主键自增长,oracle 数据库主键自动增长方法

    oracle 数据库没有像 MYSQL一样有 自动ID增值 的功能,如要实现可以用触发器. 首先就是建立一个序列,序列有有自动增值的功能,再建立一个触发器. 如: 建立一个序列 CREATE SEQU ...

  9. sequence解决oracle数据库主键不自增

    工作这么多年.总算遇到一家数据库用oracle的企业了,由于oracle与mysql的不同,mysql设置了主键(id),那他就会实现自增,插入数据时,无需指定id的值,但是oracle却无法实现主键 ...

最新文章

  1. WPC大会新动态:合作伙伴采纳Windows Azure
  2. DevExpress z
  3. 移动端、PC端网站优化需齐头并进
  4. 南昌大学计算机控制,南昌大学计算机控制实验报告数/模转换实验..doc
  5. PMCAFF微课堂视频合集 | O2O产品的颠覆与布局
  6. 干货 | 机器学习正在面临哪些主要挑战?
  7. 图书管理模块功能设计
  8. PHP扩展调用C++静态库
  9. Post与Get传值读取方法
  10. 高大上!手把手教你在京东云擎上部署个人应用!
  11. bash大括号参数扩展(Parameter Expansion)
  12. 从无线安全到内网渗透[1]
  13. One-dimensional Japanese Crossword(codeforces 712A)
  14. android 热点 连接电脑上网,安卓手机做wifi热点让笔记本上网的方法
  15. 《财富》杂志评选出必读的75本最睿智的图书
  16. python cls和self_python中cls与self与类调用
  17. Beaglebone Black——开机自动运行程序
  18. 宏基因组分析-基于Reads比对
  19. AppScan安全扫描问题解决方案
  20. citespace 版本5.6.R5无法打开, 版本为5.6.R2可以打开

热门文章

  1. 主成分分析原理解释(能力工场小马哥)
  2. MySQL中varchar最大长度是多少
  3. 【原创】QT简单计算器
  4. Wss 3.0安装指南(一)
  5. 看完后完全了解 Vue 2.0 和 Vue 3.0 的区别
  6. span里面插入文字
  7. 1.App瘦身经验总结
  8. 岁月在流逝,从阿里退下来接近70后程序猿带给我的启示
  9. Spring Roo 简介
  10. Kindeditor放置两个调用readonly错误