序列是oracle用来生产一组等间隔的数值。序列是递增,而且连续的。oracle主键没有自增类型,所以一般使用序列产生的值作为某张表的主键,实现主键自增。序列的编号不是在插入记录的时候自动生成的,必须调用序列的方法来生成(一般调用nextval方法)。我们也可以编写表的insert触发器来进自动生成。
  创建语法:

create sequence 序列名称
[start with 初始量] 
[increment by 递增量] 
[maxvalue 最大值| nomaxvalue] 
[minvalue 最小值| nominvalue] 
[cycle | nocycle] 
[cache 缓存个数| nocache];

start with:生成第一个序列号,对于升序列,其默认值为序列最小值;对于降序序列,其默认值为序列的最大值 。
increment by:用于指定序列号之间的间隔,其默认值为1,如果integer为正值,则生成的序列按升序排列,如果integer为负值,则生成的序列将按降序排列。
maxvalue:序列可以生成的最大值。
nomaxvalue:oracle将升序序列的最大值设为1027,将降序序列的最大值设为-1.这是默认选项。
minvalue:minvalue必须小于或等于start with的值,并且必须小于maxvalue的值。
nominvalue:oracle将升序的最小值设为1,或将降序序列的最小值设为-1026.这是默认值。
cycle:序列在达到最大值或最小值后,将继续从头开始生成值。
nocycle:序列在达到最大值或最小值后,将不能再继续生成值。不写默认为nocycle这是默认选项 。
cache:预先分配一组序列号,并将其保留在内存中,这样可以更快地访问序列号.当用完缓存中的所有序列号.oracle将生成另一组数值,并将其保留在缓存中。
nocache:不会加快访问速度而预先分配序列号,如果在创建序列时忽略了cache和nocache,orcale将默认缓存20个序列号。

修改语法:
alter sequence 序列名称
[start with 初始量] 
[increment by 递增量] 
[maxvalue 最大值| nomaxvalue] 
[minvalue 最小值| nominvalue] 
[cycle | nocycle] 
[cache 缓存个数| nocache];

二、例子

  以下代码person表如下:

DROP TABLE person ;
CREATE TABLE person (
id NUMBER(11) NOT NULL ,
username VARCHAR2(255 ) NULL ,
age NUMBER(11) NULL ,
password VARCHAR2(255) NULL ,
PRIMARY KEY (id)
)

  创建序列

create sequence seq_tb_person
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;

  使用序列

insert into person (id, username, age, password) values (seq_tb_person.nextval, '张三', 20, 'zhang123')

修改序列

alter sequence seq_tb_person
minvalue 1
maxvalue 999999999999999999999999999
-- start with 49 对于已经启动的序列,无法设置初始值
increment by 1
cache 20;

  查看用户的序列:

select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;

  删除序列

drop sequence 序列名;

  通过USER_OBJECTS可以查看用户拥有的序列,USER_SEQUENCES可以查看序列的设置。

重置序列

oracle序列创建以后,如果想重置序列从 0 开始,逐渐递增1,可以采用如下存储过程:

 1 create or replace
2 procedure reset_seq( p_seq_name in varchar2 )
3 is
4 l_val number;
5 begin
6 execute immediate
7 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
8
9 execute immediate
10 'alter sequence ' || p_seq_name || ' increment by -' || l_val ||
11 ' minvalue 0';
12
13 execute immediate
14 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
15
16 execute immediate
17 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
18 end;

存储过程创建以后,调用该存储过程,参数是要重置的序列名称:

call reset_seq(‘test_seq’);

使用下面的SQL语句查询需要重置的序列:

 1 SELECT  a.sequence_name 序列名称,
2 a.min_value 序列最小值,
3 to_char(to_number( a.max_value)) 序列最大值,
4 a.last_number 序列当前值,
5 CASE a.last_number WHEN 1 THEN '--不需要重置;' ELSE
6 'CALL seq_reset(''' || a.sequence_name || ''');' END 重置序列脚本,
7 'DROP SEQUENCE ' || a.sequence_name 删除序列脚本,
8 'RENAME ' || a.sequence_name || ' TO {newname}' 重命名脚本
9 FROM USER_SEQUENCES a WHERE a.last_number<>1
10 ORDER BY a.sequence_name ASC;

重置序列脚本这列查询出来的值就是调用存储过程重置序列的SQL语句,直接执行SQL将重置序列。

三、注意点

  • 一个序列可以被多张别使用,不过一般建议为每个表建立单独的序列。
  • 当使用到序列的事务发生回滚。会造成序列号不连续。在用生成的序列值作为编号做插入数据库操作时,可能遇到事务提交失败,从而导致序号不连续。
  • 大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 n个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数最好不要设置过大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入n个。这种情况也能会在数据库关闭时也会导致序号不连续。

Oracle 使用序列实现自增列 及重置序列的更多相关文章

  1. SQL的自增列如何重置

    第一种方法:首先去除该列自增的标识,然后再修改id的值,成功修改后,再加上自增标识:如果不修改自增标识,会报错:“无法更新标识列”. 第二种方法:删除该自增列,而后重建一个自增列.

  2. Oracle自增列

    一.介绍: 在设计数据库时,有时候希望表的某一列为自增列,例如编号,本文就介绍如何在oracle数据库中实现自增列,需要两个步骤: 1)构建序列(sequence) 在oracle中sequence就 ...

  3. PowerDesigner中如何生成主键和自增列

    1.SQL Server版本: 第一步,首先要建立与数据库的连接,方法较多,这里举个例子: http://www.cnblogs.com/netsql/archive/2010/05/17/17375 ...

  4. Oracle重置序列

    oracle序列创建以后,如果想重置序列从 0 开始,逐渐递增1,可以采用如下存储过程: create or replace procedure reset_seq( p_seq_name in va ...

  5. oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)

    0   前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...

  6. oracle 利用序列与触发器实现列自增

    实现步骤:先创建序列,后创建触发器 1.创建序列 create sequence 序列名 increment start maxvalue ; 2.创建触发器 create or replace tr ...

  7. Oracle自增列创建方法

    最近在做Oracle的项目,由于以前没有接触过Oracle的开发,遇到了不少的问题,比如给Oracle表添加自增列,与SQL Server就不同. Oracle没有自增字段这样的功能,但是通过触发器( ...

  8. Oracle 12c的自增列Identity Columns

    在Oracle的12c版本中,Oracle实现了类似MySQL中的auto_increment的自增列,下面我们看一起Oracle是怎么实现的. Oracle Database 12c Enterpr ...

  9. 使用JDBC插入数据到ORACLE,使用标识列自增列

    不同于SQL Server的是,Oracle中插入数据的时候,没有自增列或者是标识列,但是,我们又不想显式的进行主键的插入,这里,必须在Oracle数据库中指定一个标识列,或者说是一个序列.具体方法如 ...

随机推荐

  1. MySQL 常用30种SQL查询语句优化方法

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  2. linux服务基础之http协议

    URI:Uniform Resource Identifier URL: Uniform Resource Locator,用于描述某服务器某特定资源的位置 URN: Uniform Resource ...

  3. xueping wang 记录

    https://www.bbsmax.com/A/lk5aVBod1O/ https://pkgs.org/statistics/ 在firefox的调试控制台, 下面有一个独立的分割的控制台窗口, ...

  4. 51nod1363 最小公倍数之和

    题目描述 给出一个n,求1-n这n个数,同n的最小公倍数的和. 例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mo ...

  5. 实验一:c++简单程序设计(1)

    实验结论 编程练习2-28 switch版源码: #include <iostream> using namespace std; int main(void) { cout <&l ...

  6. 让小乌龟可以唱歌——对Python turtle进行拓展

    在Scratch中,小猫是可以唱歌的,而且Scratch的声音木块有着丰富的功能,在这方面Python turtle略有欠缺,今天我们就来完善一下. Python声音模块 Python处理声音的模块很 ...

  7. HDU - 3652

    #include<stdio.h> #include<string.h> #include<math.h> #include<time.h> #incl ...

  8. js-对象的重要概念

    抽象 抽象是通过特定的实例抽取共同特征以后形成概念的过程.它强调主要特征,忽略次要特征.一个对象是现实世界中一个实体的抽象. 对象三个特性 1.封装 把客观事物封装成抽象的类,隐藏属性和方法的实现细节 ...

  9. [数据结构] 2.7 Heap 堆

    * 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任. 1.堆是什么? (如图所示是一个小堆) 1)堆是一颗完全二叉树,它的最后一层不是满的,其他每一层都是满的,最后一层从左到右也没有空隙 ...

  10. 用Python实现支持向量机并处理Iris数据集

    SVM全称是Support Vector Machine,即支持向量机,是一种监督式学习算法.它主要应用于分类问题,通过改进代码也可以用作回归.所谓支持向量就是距离分隔面最近的向量.支持向量机就是要确 ...