首先,我使用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?
答案 0 :(得分:6)
永远不要依赖序列进行无间隙编号。
缓存值是数据库服务器在内存中保存的序列值的数量,以避免使用最近使用的值继续更新其内部$ SEQ表。如果减少缓存值,则增加$ SEQ表必须修改的速率,这会降低系统的速度。
缓存值可以老化,在系统重新启动时丢失,如果事务回滚,则不会重用值。
间隙的存在对您来说不应该是一个问题 - 如果是,那么您将需要使用序列之外的其他内容来生成数字,这样做会将插入序列化到该表中。
答案 1 :(得分:0)
尝试将NOCACHE选项用于序列。
http://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm
答案 2 :(得分:0)
NOCACHE会起作用,但出于多种原因也是一个坏主意,如果你计划将你的应用程序带到Oracle RAC上,那就完全是胡说八道。
Oracle序列用于(内部)唯一ID,不适用于要求强加的严格渐进数字。例如,假设使用序列生成经典的“协议编号”是许多财务会计软件的常见缺陷:开始时看起来很容易,但是当项目增长时它就会导致你死亡。