【问题标题】:ORACLE 10g auto increment trigger/sequence doesn't increment as programmedORACLE 10g 自动递增触发器/序列不按编程递增
【发布时间】: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

有什么想法吗?

【问题讨论】:

    标签: triggers oracle10g sequence auto-increment


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-24
      • 2010-09-23
      • 1970-01-01
      • 2016-03-07
      • 2011-11-08
      • 2013-04-29
      • 2014-09-09
      • 2011-09-11
      相关资源
      最近更新 更多