Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence

使用oracle11g插入数据时遇到这样一个问题:

1 --创建测试表--
2 CREATE TABLE tbl_test(
3 test_id NUMBER PRIMARY KEY,
4 test_name VARCHAR2(20)
5 );
6
7 --为tbl_test创建序列--
8 CREATE SEQUENCE seq_test
9     INCREMENT BY 1 -- 每次加几个
10     START WITH 1 -- 从1开始计数
11 ;
12
13 --插入测试数据--
14 INSERT INTO tbl_test VALUES(seq_test.nextval,'测试');
15 COMMIT;
16
17 --查询表中的数据
18 SELECT * FROM tbl_test;

显示结果:

问题原因:

·当我们使用序列作为插入数据时,如果使用了“延迟段”技术,则跳过序列的第一个值

·Oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性:

当我们创建了新的表(table)和序列(sequence),
在插入(insert)语句时,序列会跳过第一个值(1)。
所以结果是插入的序列值从 2(序列的第二个值) 开始, 而不是 1开始。

想要解决这个问题有两种方法:
更改数据库的“延迟段创建”特性为false(需要有相应的权限)
ALTER SYSTEM SET deferred_segment_creation=FALSE;
或者
在创建表时让seqment立即执行,如:

CREATE TABLE tbl_test(
test_id NUMBER PRIMARY KEY,
test_name VARCHAR2(20)
)
SEGMENT CREATION IMMEDIATE;

以上两种方法都可以解决之前的问题。

oracle中怎获得某个表的正在或曾经使用的sequence?
好象它们两者没有依属联系,而确实在工作中又容易遇见此类问题.
从序列的角度来思考的话,仅跟用户相关。
以下步骤可以参考:
1 从系统视图中取得所有序列的相关信息。
注意相关权限。
select sequence_name,min_value,max_value,increment_by,last_number from all_sequences
如果能够能够排除 用户A的表数据,采用了用户B的sequence来生成数据的情况,那可以加上
where sequence_owner=' '; -----适合的用户
或者从USER_SEQUENCES中提取。
2 从关心的表中提取敏感字段的最大值
select max(id) from test;
3 将两者对比。或者将上述两个查询连接到一起来查询。如果当前该表没有被插入,并且,近期没有被删除,那么,该max(id)+1=last_number ;
如果非要弄清楚的话,那就将表数据保护起来,拒绝删除数据,当发现数据插入后,观察插入的频度和事务提交后序列列值变化的大小,由此最终能判断出是哪个序列号。基于非要准确的搞清楚的前提下,使用排出法,将上述最接近的序列按照从轻度怀疑到高度怀疑的顺序,再备份的情况下,依次删除、恢复.....这样肯定能搞准。

还有一个最好的办法以后遇到这种情况就简单了。在该表上建立基于插入后的触发器,在触发器中包含上面查询思想,将max(id)+1=last_number 的序列名返回。。。。则绝对不会错
.
知识有限,在此也期盼能学习到更高级的方法。
希望能帮到你。.

oracle表中怎建序列
在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
1、Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10;

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值,然后返回 sequence 值
比如:
emp_sequence.CURRVAL
emp_sequence.NEXTVAL

可以使用sequence的地方:

  • 不包含子查询、snapshot、VIEW的 SELECT 语句
  • INSERT语句的子查询中
  • NSERT语句的VALUES中
  • UPDATE 的 SET中

可以看如下例子:
INSERT INTO emp VALUES
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);

SELECT empseq.currval FROM DUAL;

但是要注意的是:

  • 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?

  • 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

2、Alter Sequence
你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .
Alter sequence 的例子
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000后从头开始
NOCACHE ;

Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence的更多相关文章

  1. ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

    如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ...

  2. IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值 的解决方法一例

    如题 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值 很多网上的文章是设置表的 IDENTITY_INSERT 为 ON EF中还要对模型就行设置 [Column(N ...

  3. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值

    {"当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'OrderList' 中的标识列插入显式值"} 对于这个异常可以从两个角度来处理:A:数据库执行语句  B: ...

  4. EF:插入记录失败,提示当 IDENTITY_INSERT 设置为 OFF 时,不能向表中的标识列插入显式值

    EF忽然报错:增加记录时,提示当 IDENTITY_INSERT 设置为 OFF 时,不能向表 '...' 中的标识列插入显式值.真奇怪,添加记录方法一向好地地,从没出过错.要出错,那也是Update ...

  5. oracle数据库表用序列实现主键自增长

    原理注意:序列和触发器必须建立在同一个用户名下否则运行出错1.建立数据表create table 表名(           userid number(10) primary key,        ...

  6. 一个语句创建Oracle所有表的序列

    -- 动态创建序列 declare cursor c_job is select TABLE_NAME from user_tables; c_row c_job%rowtype; v_sql ); ...

  7. ORACLE误删除表数据或误更新/插入数据如何恢复

    工作中一不小心将本不该删除/更新/插入的数据进行删除/更新/插入了,这时候一定要尽快进行恢复. 工具/原料   PL/SQL 方法/步骤     首先新建一张测试表TEST,里面输入记录.由于删除/更 ...

  8. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值。

    出现以上错误是应为在执行insert语句时,将自动增加的字段加入,导致报错. 解决办法:把自增列的字段从插入语句中删除

  9. 当 IDENTITY_INSERT 设置为 OFF 时,不能向表 中的标识列插入显式值错误的解决方法

    一个主键.两个外键,把两个外键改为非空就行了. CREATE TABLE [dbo].[User_Compare]( ,) NOT NULL, [UserId] [int] NOT NULL, [Pa ...

随机推荐

  1. 实战Java虚拟机之四:提升性能,禁用System.gc() ?

    今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟 ...

  2. 实战Java虚拟机之二“虚拟机的工作模式”

    今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...

  3. Css3:选择器、字体和颜色样式

    1.私有前缀及其用法 在CSS3模块标准尚未被W3C批准或者标准所提议的特性尚未被浏览器完全实现时,浏览器厂商会使用所谓的私有前缀来测试“试验性的”CSS特性.看看CSS3中实现圆角的代码: .rou ...

  4. 青蛙跳100级台阶算法,完整可运行,php版本

    /* 算法题目 * 2016年4月11日16:11:08 * 一只青蛙,一次可以跳1步,或者2步,或者3步,现在要跳100级台阶,请问青蛙有多少种上100级台阶的跳法 * 1步的有$n 2步的有$m ...

  5. SOA架构设计(转发)

    阅读目录: 1.背景介绍 2.SOA的架构层次 2.1.应用服务(原子服务) 2.2.组合服务 2.3.业务服务(编排服务) 3.SOA化的重构 3.1.保留服务空间,为了将来服务的组合 4.运用DD ...

  6. C# 动态调用webservice

    最近项目中,用到动态调用webservice的内容,此处记录下来,留着以后COPY(我们只需要在XML,config文件,或者数据库中配置webservice连接地址和方法名即可使用): using ...

  7. java synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  8. php count()函数用法 及其 一个坑

    用法 count() 函数返回数组中元素的数目. count(array,mode); [mode] 0 - 默认.不计算多维数组中的所有元素. 1 - 递归地计算数组中元素的数目(计算多维数组中的所 ...

  9. UISprite(NGUI)扩展 图片镂空

    NGUI 版本2.6.3 在做新手引导时,需要高亮特定UI元素,也就是加个黑色蒙板,然后在蒙版上显示这个UI元素,为了简单方便我扩展了下UISprite,来镂空指定空间. 分为2种,矩形和圆镂空,矩形 ...

  10. Redis 3.2 Linux 环境集群搭建与java操作

    redis 采用 redis-3.2.4 版本. 安装过程 1. 下载并解压 cd /usr/local wget http://download.redis.io/releases/redis-3. ...