Oracle新表使用序列(sequence)作爲插入值,初始值不是第一個

使用oracle11g插入數據時遇到了這樣的情況:

1 --創建測試表--
 2 CREATE TABLE tbl_test(
 3        test_id NUMBER PRIMARY KEY,
 4        test_name VARCHAR2(20)
 5 );
 6 
 7 --爲tbl_test創建序列--
 8 CREATE SEQUENCE seq_test
 9     INCREMENT BY 1 -- 每次加幾個
10     START WITH 1 -- 從1開始計數
11 ;
12 
13 --插入測試數據--
14 INSERT INTO tbl_test VALUES(seq_test.nextval,'測試');
15 COMMIT;
16 
17 --查詢表中的數據
18 SELECT * FROM tbl_test;

顯示結果:

即,結果是 :

TEST_ID  TEST_NAME

  2      測試

但是我想要的結果是 :

TEST_ID  TEST_NAME

  1      測試

 

問題原因:

·當我們使用序列作爲插入數據時,如果使用了“延遲段”技術,則跳過序列的第一個值

·Oracle從 11.2.0.1版本開始,提供了一個“延遲段創建”特性:

當我們創建了新的表(table)和序列(sequence),
在插入(insert)語句時,序列會跳過第一個值(1)。
所以結果是插入的序列值從 2(序列的第二個值) 開始, 而不是 1開始。

想要解決這個問題有兩種方法:
 1.更改數據庫的“延遲段創建”特性爲false(需要有相應的權限)

SQL語句如下:

ALTER SYSTEM SET deferred_segment_creation=FALSE;

或者


 2.在創建表時讓seqment立即執行

SQL語句如下:

CREATE TABLE tbl_test(
    test_id NUMBER PRIMARY KEY, 
    test_name VARCHAR2(20)
)
 SEGMENT CREATION IMMEDIATE;

以上兩種方法都可以解決之前的問題。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章