ORACLE 10g 自动递增触发器/序列不按编程递增

Posted

技术标签:

【中文标题】ORACLE 10g 自动递增触发器/序列不按编程递增【英文标题】:ORACLE 10g auto increment trigger/sequence doesn't increment as programmed 【发布时间】:2012-04-01 12:54:43 【问题描述】:

我在 ORACLE 10 DB 上开发了以下序列,该序列通过 1 自动增加名为 t_client 的表的 id 列(还开发了一个触发器并在何时执行此表上的新数据已注册)

问题是有时序列不会增加 1,如果不是在 21。我并没有真正通过 21 的增量找到问题。这是代码示例

Secuence 客户端连续

CREATE SEQUENCE  user_owner.ClientConsecutive
MINVALUE 0 
MAXVALUE 999999999999999999999999999 
INCREMENT BY 1 
START WITH 1 
CACHE 20 
NOORDER NOCYCLE ;

Trigger_Client_ID

create or replace
TRIGGER user_owner.TRIGGER_CLIENT_ID 
BEFORE INSERT ON T_CLIENT
REFERENCING NEW AS NEW FOR EACH ROW
DECLARE valueSequence NUMBER := 0;
BEGIN
SELECT ClientConsecutive.NEXTVAL INTO valorSecuencia FROM DUAL;
:NEW.ID_CLIENTE := valueSequence;
END;

当与此对象关联的应用程序执行它时,在 SQLdeveloper 上查找序列详细信息有时会可视化

LAST_NUMBER 2

当我在空表上注册新数据时这是正确的,但有时会说

LAST_NUMBER 21

有什么想法吗?

【问题讨论】:

【参考方案1】:

Oracle 序列不保证是无间隙的。事实上,你几乎可以保证偶尔会有差距。

在您的情况下,您使用的默认缓存大小为 20。当数据库关闭或序列缓存过期内存不足时,序列缓存中的任何值都将丢失。因此,如果缓存最初保存数字 1-20,您执行 nextval 返回值 1,并且在您再次调用 nextval 之前缓存老化超出 SGA,您希望获得 21 的值下次你打电话给nextval

您可以通过将序列上的 CACHE 大小减小到 1 来减少间隙的频率。这不会消除间隙 - 例如,仍然会出现事务回滚的情况。它会降低性能。一般来说,您不应该担心间隙,因为根据定义,序列生成的主键只是应该是唯一标识符。

【讨论】:

以上是关于ORACLE 10g 自动递增触发器/序列不按编程递增的主要内容,如果未能解决你的问题,请参考以下文章

让oracle数据库的表的id自动递增

Oracle里面想实现自动插入递增的序号

oracle 10g编程

Oracle Forms 10g 自动查询

在 oracle 10g 中添加自动增量和自动减量列

重置自动递增序列 pl-sql