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

时间:2012-03-15 23:03:13

标签: triggers oracle10g sequence auto-increment

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

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

Secuence ClientConsecutive

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 个答案:

答案 0 :(得分:4)

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

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

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