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 自动递增触发器/序列不按编程递增的主要内容,如果未能解决你的问题,请参考以下文章