Oracle Sequence以2而不是1开头

时间:2010-11-11 11:14:53

标签: oracle sequence oracle11g

意外行为:

我遇到了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 开头,插入的第一个值为 2

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

答案 0 :(得分:16)

这是documented in the 11.2 SQL Language Reference所说的,

  

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

请参阅Jeffrey Kemp关于My Oracle Support(Metalink)注释和解决方法的答案中的链接。

答案 1 :(得分:7)

我说原因是这个“未记录的功能”。请参阅My Oracle Support Document ID 1273858.1(遗憾的是,它位于付费专区后面,无法在此处复制)。

尝试不创建延迟段,并查看问题是否仍然存在。

答案 2 :(得分:3)

我无法在11G上重现,即在按照您的步骤后表格中包含1。

但是,这是否应被视为“问题”是有争议的,因为序列永远不会保证无间隙。 START WITH保证的是序列永远不会返回比指定起始值更低的值 - 例如避免与现有数据冲突。我确实同意你看到的是令人惊讶的,我很想知道原因!

答案 3 :(得分:1)

使用:

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