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;

 


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM