【Sequence】序列操作start with,nextval,currval三者之間的“複雜”關係與重要結論
透過這篇文章談一下在使用Sequence時候需要注意的事項。細節重於一切。
1.建立測試用序列S
sec@ora10g> drop sequence s;
sec@ora10g> create sequence s start with 99;
Sequence created.
2.使用seq簡單檢視一下s的基本資訊
sec@ora10g> select * from seq where SEQUENCE_NAME = 'S';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------- --------- ---------- ------------ - - ---------- -----------
S 1 1.0000E+27 1 N N 20 99
3.使用dbms_metadata得到序列的詳細的建立語句
sec@ora10g> set linesize 150
sec@ora10g> set longchunksize 1000
sec@ora10g> select dbms_metadata.get_ddl('SEQUENCE','S') as "Create Sequence Statements" from dual;
Create Sequence Statements
------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE SEQUENCE "SEC"."S" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 99 CACHE 20 NOORDER NOCYCLE
透過上面的建立,我們得到的序列s是從99開始的。
4.在對s取nextval時,推測一下,得到的值是多少??
重要結論一:在初建立的Sequence上第一次使用nextval的時候,得到是初始值,不是初始值加一!
請看下面的演示,得到的是初始化的99值,不是100!!
sec@ora10g> select s.nextval from dual;
NEXTVAL
----------
99
如果此時再繼續取nextval的話,一切恢復正常
sec@ora10g> select s.nextval from dual;
NEXTVAL
----------
100
sec@ora10g> select s.nextval from dual;
NEXTVAL
----------
101
5.新開啟的session中允許直接使用currval取Sequence的當前值麼?
重要結論二:第一次NEXTVAL初始化之後才能使用CURRVAL取值。
sec@ora10g> conn sec/sec
Connected.
sec@ora10g> select s.currval from dual;
select s.currval from dual
*
ERROR at line 1:
ORA-08002: sequence S.CURRVAL is not yet defined in this session
sec@ora10g> select s.nextval from dual;
NEXTVAL
----------
102
sec@ora10g> select s.currval from dual;
CURRVAL
----------
102
6.雖然上面看到currval必須在nextval之後使用,不過,可以在一條SQL語句中同時得到nextval和currval值,而且它們在SQL中不分先後順序,請看下面的演示。
sec@ora10g> conn sec/sec
Connected.
sec@ora10g> select s.currval from dual;
select s.currval from dual
*
ERROR at line 1:
ORA-08002: sequence S.CURRVAL is not yet defined in this session
sec@ora10g> select s.currval, s.nextval from dual;
CURRVAL NEXTVAL
---------- ----------
103 103
sec@ora10g> conn sec/sec
Connected.
sec@ora10g> select s.currval from dual;
select s.currval from dual
*
ERROR at line 1:
ORA-08002: sequence S.CURRVAL is not yet defined in this session
sec@ora10g> select s.nextval, s.currval from dual;
NEXTVAL CURRVAL
---------- ----------
104 104
7.將Oracle 10gR2官方文件關於序列的create和alter的命令語法copy一份在此,便於參考
CREATE SEQUENCE [ schema. ]sequence
[ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
]
[ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
]... ;
ALTER SEQUENCE [ schema. ]sequence
{ INCREMENT BY integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
}
[ INCREMENT BY integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
]... ;
8.小結
透過這個小實驗,得到的結論有:
1)結論一:在初建立的Sequence上第一次使用nextval的時候,得到是初始值,不是初始值加一!
2)結論二:第一次NEXTVAL初始化之後才能使用CURRVAL取值;
3)結論三:可以在一條SQL語句中同時得到nextval和currval值;
4)結論四:從上面的alter sequence的語法看,可以得到這樣一個結論,無法使用alter語句修改序列的當前值。
很有必要重點關注以上這些結論,尤其是第一條。
-- The End --
1.建立測試用序列S
sec@ora10g> drop sequence s;
sec@ora10g> create sequence s start with 99;
Sequence created.
2.使用seq簡單檢視一下s的基本資訊
sec@ora10g> select * from seq where SEQUENCE_NAME = 'S';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------- --------- ---------- ------------ - - ---------- -----------
S 1 1.0000E+27 1 N N 20 99
3.使用dbms_metadata得到序列的詳細的建立語句
sec@ora10g> set linesize 150
sec@ora10g> set longchunksize 1000
sec@ora10g> select dbms_metadata.get_ddl('SEQUENCE','S') as "Create Sequence Statements" from dual;
Create Sequence Statements
------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE SEQUENCE "SEC"."S" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 99 CACHE 20 NOORDER NOCYCLE
透過上面的建立,我們得到的序列s是從99開始的。
4.在對s取nextval時,推測一下,得到的值是多少??
重要結論一:在初建立的Sequence上第一次使用nextval的時候,得到是初始值,不是初始值加一!
請看下面的演示,得到的是初始化的99值,不是100!!
sec@ora10g> select s.nextval from dual;
NEXTVAL
----------
99
如果此時再繼續取nextval的話,一切恢復正常
sec@ora10g> select s.nextval from dual;
NEXTVAL
----------
100
sec@ora10g> select s.nextval from dual;
NEXTVAL
----------
101
5.新開啟的session中允許直接使用currval取Sequence的當前值麼?
重要結論二:第一次NEXTVAL初始化之後才能使用CURRVAL取值。
sec@ora10g> conn sec/sec
Connected.
sec@ora10g> select s.currval from dual;
select s.currval from dual
*
ERROR at line 1:
ORA-08002: sequence S.CURRVAL is not yet defined in this session
sec@ora10g> select s.nextval from dual;
NEXTVAL
----------
102
sec@ora10g> select s.currval from dual;
CURRVAL
----------
102
6.雖然上面看到currval必須在nextval之後使用,不過,可以在一條SQL語句中同時得到nextval和currval值,而且它們在SQL中不分先後順序,請看下面的演示。
sec@ora10g> conn sec/sec
Connected.
sec@ora10g> select s.currval from dual;
select s.currval from dual
*
ERROR at line 1:
ORA-08002: sequence S.CURRVAL is not yet defined in this session
sec@ora10g> select s.currval, s.nextval from dual;
CURRVAL NEXTVAL
---------- ----------
103 103
sec@ora10g> conn sec/sec
Connected.
sec@ora10g> select s.currval from dual;
select s.currval from dual
*
ERROR at line 1:
ORA-08002: sequence S.CURRVAL is not yet defined in this session
sec@ora10g> select s.nextval, s.currval from dual;
NEXTVAL CURRVAL
---------- ----------
104 104
7.將Oracle 10gR2官方文件關於序列的create和alter的命令語法copy一份在此,便於參考
CREATE SEQUENCE [ schema. ]sequence
[ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
]
[ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
]... ;
ALTER SEQUENCE [ schema. ]sequence
{ INCREMENT BY integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
}
[ INCREMENT BY integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
]... ;
8.小結
透過這個小實驗,得到的結論有:
1)結論一:在初建立的Sequence上第一次使用nextval的時候,得到是初始值,不是初始值加一!
2)結論二:第一次NEXTVAL初始化之後才能使用CURRVAL取值;
3)結論三:可以在一條SQL語句中同時得到nextval和currval值;
4)結論四:從上面的alter sequence的語法看,可以得到這樣一個結論,無法使用alter語句修改序列的當前值。
很有必要重點關注以上這些結論,尤其是第一條。
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-617172/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構-邏輯關係&物理關係、時間複雜度、空間複雜度、順序表資料結構時間複雜度
- setup與data、methods三者間的關係
- oracle中的CURRVAL和NEXTVAL用法Oracle
- Jacek Sliwinski:論述遊戲設計複雜性與成功的關係遊戲設計
- Python中的賦值與淺複製與深複製之間的關係Python賦值
- ODS與DW之間的關係
- tep環境變數、fixtures、用例三者之間的關係變數
- 時間複雜度與空間複雜度時間複雜度
- Oracle之Sequence(序列)Oracle
- TLS與SSL之間關係TLS
- ps 與 svmon之間關係
- 集合論雜記——關係的性質
- 類與類之間的基本關係
- Oracle中Nextval用法SEQUENCE與SYS_GUID()OracleGUI
- 思考 TPS 與 RT 之間的關係
- 談Ubuntu與FOSS之間的關係(轉)Ubuntu
- 科學論文的可複製性、被引用量和創新性的複雜關係
- FAILGROUP和REDUNDANCY之間的關係關係!AI
- [全程建模]元用例和需求與績效之間的關係討論
- 關於計算時間複雜度和空間複雜度時間複雜度
- 類之間的關係
- 【資料結構】-時間複雜度和空間複雜度資料結構時間複雜度
- 正確理解 AsyncTask,Looper,Handler三者之間的關係(基於android 4.0)OOPAndroid
- 資料結構與演算法之間有何關係?資料結構演算法
- 成員方法與const之間的關係
- JavaScript 資料結構與演算法之美 - 時間和空間複雜度JavaScript資料結構演算法複雜度
- [java基礎]之JVM/JRE/JDK三者的關係JavaJVMJDK
- 時間解析度、取樣率與取樣深度三者關係理解
- 時間與空間複雜度分析複雜度
- 【java】類之間的關係Java
- OI 數論中的上界估計與時間複雜度證明時間複雜度
- React,Redux,React-redux的錯綜複雜關係ReactRedux
- Linux的匯流排-裝置-驅動三者之間的關係和框架的理解Linux框架
- 論Asp與XML的關係(轉)XML
- 每一秒都很重要:響應時間與資料洩露影響之間的密切關係
- 探索“精益”與“智慧製造”之間的關係
- dispaly、position、float之間的關係與相互作用
- ERP與精益生產之間的關係