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;
問題原因:
·當我們使用序列作為插入數據時,如果使用了“延遲段”技術,則跳過序列的第一個值
·Oracle從 11.2.0.1版本開始,提供了一個“延遲段創建”特性:
即
當我們創建了新的表(table)和序列(sequence),
在插入(insert)語句時,序列會跳過第一個值(1)。
所以結果是插入的序列值從 2(序列的第二個值) 開始, 而不是 1開始。
想要解決這個問題有兩種方法:
更改數據庫的“延遲段創建”特性為false(需要有相應的權限)
1 ALTER SYSTEM SET deferred_segment_creation=FALSE;
或者
在創建表時讓seqment立即執行,如:
1 CREATE TABLE tbl_test( 2 test_id NUMBER PRIMARY KEY, 3 test_name VARCHAR2(20) 4 ) 5 SEGMENT CREATION IMMEDIATE;