2010-11-11 35 views
11

意外行爲:甲骨文序列開始2,而不是1

我遇到11g版本的Oracle序列的怪異行爲(按10g作品):

CREATE SEQUENCE test_sequence START WITH 1; 
CREATE TABLE test_table (val INT); 

INSERT INTO test_table VALUES (test_sequence.NEXTVAL); 

即使序列從開始,插入的第一個值是:

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

+1

它返回'1'我'Oracle數據庫11g第11.1.0.6.0 - 64位Production' – Quassnoi 2010-11-11 11:18:09

+1

@Quassnoi:這似乎是'11.2 「功能」 '(見傑弗裏的回答)。感謝您的測試! – 2010-11-11 12:24:07

回答

16

這是documented in the 11.2 SQL Language Reference的地方說,

如果你試圖插入序列值到使用延遲段創建,第一個值序列的回報會被跳過的表。

請參閱Jeffrey Kemp對My Oracle Support(Metalink)說明和解決方法的解答中的鏈接。

3

我不能在11G上覆制,也就是說,在你的步驟之後,表格中包含1。

然而,這是否應該被視爲一個「問題」,這是值得商榷的,因爲序列永遠不能保證沒有間隙。 START WITH保證的是,該序列永遠不會返回比指定的起始值更低的值低的 - 例如,避免與現有數據發生衝突。不過,我同意你所看到的是令人驚訝的,我很想知道原因!

7

我想說的原因是這個「無證的功能」。請參閱我的Oracle支持文檔ID 1273858.1(這不幸在付費牆後面,因此無法在此複製)。

嘗試不延遲段創建,看看問題是否存在。

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;