我在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
有什么想法吗?
答案 0 :(得分:4)
不保证Oracle序列无间隙。事实上,你几乎可以保证偶尔会有差距。
在您的情况下,您使用的默认缓存大小为20.当数据库关闭或序列缓存老化时内存不足时,序列缓存中的任何值都将丢失。因此,如果缓存最初保持数字1-20,那么您执行nextval
返回值1,并且在再次调用nextval
之前缓存已超出SGA,您希望得到一个下次拨打nextval
时,值为21。
您可以通过将序列上的CACHE
大小减少到1来减少间隙的频率。这不会消除间隙 - 例如,仍然会出现事务被回滚的情况,例如。它会降低性能。一般而言,您不应该关注间隙,因为根据定义,序列生成的主键只是应该是唯一标识符。