如何仅将序列增加1?

时间:2013-10-16 11:12:24

标签: sql oracle oracle11g

首先,我使用jdbc驱动程序在java中运行所有这些...

这里我定义了一个表:

create table HistoryCCP(
  ID     NUMBER(6)      NOT NULL,
  SCRIPT VARCHAR2(1000) NOT NULL
 )

这里我定义了一个序列:

CREATE SEQUENCE SYSTEM.HistoryId  
   MINVALUE  1 
   MAXVALUE 1000000 
   INCREMENT BY 1 
   START WITH 1  
   NOORDER   
   NOCYCLE

现在我使用此处插入表格:

insert into HistoryCCP 
  values (SYSTEM.HistoryId.nextval ,'HELLOOOO  ')

每当我关闭程序并再次运行并尝试插入时,它会将其递增10! 当我定义这样的序列时:

CREATE SEQUENCE SYSTEM.HistoryId  
   MINVALUE  1 
   MAXVALUE 1000000 
   INCREMENT BY 1 
   START WITH 1
   CACHE 100       -- added cache parameter
   NOORDER   
   NOCYCLE

它增加100! 你知道它为什么会这样,以及如何将它增加1?

3 个答案:

答案 0 :(得分:6)

永远不要依赖序列进行无间隙编号。

缓存值是数据库服务器在内存中保存的序列值的数量,以避免使用最近使用的值继续更新其内部$ SEQ表。如果减少缓存值,则增加$ SEQ表必须修改的速率,这会降低系统的速度。

缓存值可以老化,在系统重新启动时丢失,如果事务回滚,则不会重用值。

间隙的存在对您来说不应该是一个问题 - 如果是,那么您将需要使用序列之外的其他内容来生成数字,这样做会将插入序列化到该表中。

答案 1 :(得分:0)

答案 2 :(得分:0)

NOCACHE会起作用,但出于多种原因也是一个坏主意,如果你计划将你的应用程序带到Oracle RAC上,那就完全是胡说八道。

Oracle序列用于(内部)唯一ID,不适用于要求强加的严格渐进数字。例如,假设使用序列生成经典的“协议编号”是许多财务会计软件的常见缺陷:开始时看起来很容易,但是当项目增长时它就会导致你死亡。