代码之家  ›  专栏  ›  技术社区  ›  Peter Lang

以2而不是1开头的Oracle序列

  •  11
  • Peter Lang  · 技术社区  · 14 年前

    意外行为:

    我遇到了11g的Oracle序列的奇怪行为(与10g一起工作):

    CREATE SEQUENCE test_sequence START WITH 1;
    CREATE TABLE test_table ( val INT );
    
    INSERT INTO test_table VALUES ( test_sequence.NEXTVAL );
    

    1个 ,插入的第一个值是 :

    SELECT * FROM test_table;
    
           VAL
    ----------
             2
    

    预期行为:

    NEXTVAL 未按预期插入:

    CREATE SEQUENCE test_sequence_2 START WITH 1;
    
    SELECT test_sequence_2.NEXTVAL FROM dual
    
       NEXTVAL
    ----------
             1
    

    有人能用Oracle 11g复制这个吗?这是已知的问题吗?

    我在用
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

    4 回复  |  直到 14 年前
        1
  •  16
  •   Alex Poole    10 年前

    这是 documented in the 11.2 SQL Language Reference 上面写着,

    如果尝试将序列值插入使用延迟段创建的表中,则将跳过序列返回的第一个值。

        2
  •  7
  •   Jon Heller TenG    10 年前

    我认为原因是这个“无证特征”。请参阅我的Oracle支持文档ID 1273858.1(不幸的是,它位于付费墙后面,无法在此处复制)。

    在不延迟段创建的情况下尝试它,看看问题是否仍然存在。

        3
  •  3
  •   Tony Andrews    14 年前

    然而,这是否应该被视为一个“问题”是有争议的,因为序列永远不能保证是无间隙的。从保证开始的是序列永远不会返回值 降低

        4
  •  1
  •   Vivek Jain    9 年前

    使用:

    CREATE SEQUENCE SQ_SEQUENCE_NAME
        INCREMENT BY 1
        START WITH 1
        MINVALUE 0  -- This will ensure start at 1!
        MAXVALUE 99
        NOCYCLE
        NOCACHE
        ORDER;