詳解序列(sequence)
詳解序列(sequence)
sequences(序列):系列用於產生一系列的整數,用於輔助組織機構的內部控制(審計與追蹤)或者簡單的用作主鍵。
當用序列來產生主鍵值的時候,該主鍵通常被叫做代理主鍵。相應的還有自然主鍵一說。
建立序列的語法格式:
CREATE SEQUENCE sequencename
[INCREMENT BY value]
[START WITH value]
[{MAXVALUE value | NOMAXVALUE}]
[{MINVALUE value | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{ORDER | NOORDER}]
[{CACHE value | NOCACHE}];
建立序列的語法中大部分語句是可選的。
Create sequence 後面的序列名一般是以“_seq”結尾的,方便將來的標識。
INCREMENT BY 表示兩個序列之間的間隔(interval),預設是增加1,可以根據業務的需要調整間隔。
指定正數表示是升序的,負數表示是降序的。
START WITH 表示序列的起點值,預設是1.可以根據業務的需求設定。如果在一個已經存在編號的表中引入序列,
確保所建立的序列的起點值大於表中最大的編號值。
如果一個序列是遞增的使用MINVALUE沒有意義。此時序列的最小值是START(起點)值。
如果序列式遞減的如果你設定了MINVALUE值,MAXVALUE值也應該設定,一般與START值保持一致。
如果不指定最小值與最大值,oracle預設使用NOMAXVALUE與NOMINVALUE值。
oracle 序列的預設值:
對一個遞增序列,NOMINVALUE的值是1.對於一個遞減序列NOMINVALUE的值是-10^26
對一個遞增序列,NOMAXVALUE的值是10^26,對於一個遞減序列NOMAXVALUE的值是-1.
CYCLE 與 NOCYCLE選項,表示當序列到達了最大值或者最小值的時候,是否迴圈使用序列值。
注意如果序列是用作主鍵值得話,使用迴圈選項會產生問題。然而有些組織迴圈使用這些序列值,
因為他們不想讓序列值無限的增大。Oracle預設是不啟用迴圈。如果序列值耗盡,使用者或者程式獲取序列值的時候會返回錯誤。
ORDER 與NOORDER,oracle預設是不啟用order的,也就是說預設使用noorder。
Order表示按照收到請求序列值的先後順序返回相應的序列值。
比如A使用者先請求,B使用者後請求,如果序列值是遞增的,那麼A使用者獲得值如果是10,那麼B使用者獲得的值就是11了。
CACHE與NOCACHE,如果要在短期內產生大量的序列值,會消耗系統比較多的資源,使系統的效能變差。
如果使用的是CACHE選項,oracle一次會一次產生一組值,然後把他們放在記憶體中快取起來。
如果使用的是NOCACHE選項,則是收到一個請求產生一個值。如果使用者在建立序列的時候,沒有指定該項,
oracle預設使用CACHE 20。也就是在記憶體中快取20序列值供使用。
序列值之間產生間隔(gap)的原因:
序列值產生以後資料庫系統崩潰,重啟後這些崩潰時未被利用的序列值。不能再生。
回滾操作引起的序列值間隔。
由於序列值是一個獨立的物件。其他使用者或者表使用該序列,會引起序列值的間隔。
一個序列值產生以後就不能再次產生。除非等下一次迴圈。如果序列值是當做主鍵的值來使用的,間隔是無關緊要的問題。
序列是一個獨立的物件,不依附於某一張表,某一列,不同的使用者,不同的表也可以使用相同的序列。
如果序列是用於審計跟蹤,序列是由一張表獨享的,並且設定為NOCACHE。
SQL> create sequence orders_order#_seq
2 increment by 1
3 start with 1000
4 nocache
5 nocycle
6 order;
Sequence created.
使用資料字典檢視user_sequenes查詢相關序列的詳細資訊
SQL> select * from user_sequences
2 where sequence_name='ORDERS_ORDER#_SEQ';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
ORDERS_ORDER#_SEQ 1 1.0000E+28 1 N Y 0 1000
使用nextval,currval偽列來獲得orders_order#_seq的值,nextval用於獲得下一個值,currval用於儲存最新獲得的值。
當一個使用者剛登陸到資料庫currval值是空的,需要先產生nextval。
SQL> select orders_order#_seq.nextval from dual;
NEXTVAL
----------
1000
SQL> select orders_order#_seq.currval from dual;
CURRVAL
----------
1000
SQL> desc customers
Name Null? Type
----------------------------------------- -------- ----------------------------
CUSTOMER# NOT NULL NUMBER(4)
LASTNAME NOT NULL VARCHAR2(10)
FIRSTNAME NOT NULL VARCHAR2(10)
ADDRESS VARCHAR2(20)
CITY VARCHAR2(12)
STATE VARCHAR2(2)
ZIP VARCHAR2(5)
REFERRED NUMBER(4)
REGION CHAR(2)
EMAIL VARCHAR2(30)
SQL> insert into customers
2 values(orders_order#_seq.nextval, 'MORALES', 'BONITA', 'P.O. BOX 651', 'EASTPOINT', 'FL', '32328', NULL, 'S E', '');
1 row created.
orders_order#_seq序列為客戶表的客戶ID(customer#)列提供數值。
SQL> select customer#
2 from customers;
CUSTOMER#
----------
1001
序列可以使用alter sequence 語句修改.但是start with 子句在序列修改中是不能使用的。
其他選項和序列的建立沒有其別。
同時序列的修改不能使以前產生的序列值無效。
SQL> select * from user_sequences
2 where sequence_name='ORDERS_ORDER#_SEQ';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
ORDERS_ORDER#_SEQ 1 1.0000E+28 1 N Y 0 1002
其中last_number列會儲存下一個產生的序列值。
需要刪除某個序列的時候可以使用drop sequence sequence_name;
SQL> drop sequence orders_order#_seq;
Sequence dropped.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-715776/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [題解]P4597 序列 sequence
- PostgreSQL 序列(Sequence)SQL
- Oracle - Sequence序列Oracle
- Oracle序列sequenceOracle
- 詳解數倉物件設計中序列SEQUENCE原理與應用物件
- python sequence序列Python
- Oracle之Sequence(序列)Oracle
- 裁剪序列Cut the Sequence
- oracle 序列 詳解Oracle
- oracle 序列詳解Oracle
- Python基礎教程03 - 序列 (sequence)Python
- Python3序列賦值、序列解包詳解(下)Python賦值
- Java序列化(Serializable)與反序列化詳解Java
- Django序列化元件Serializers詳解Django元件
- 「crudapi」零程式碼實現訂單序列號SequenceAPI
- 在MySQL中建立實現自增的序列(Sequence)MySql
- 17. 字串詳解及序列型別字串型別
- ORACLE sequence各引數及建立修改刪除使用詳解示例Oracle
- sequence to sequence模型模型
- JavaScript 鏈式結構序列化詳解JavaScript
- Kafka高效能揭祕:sequence IO、PageCache、SendFile的應用詳解Kafka
- 詳解數倉中sequence的應用場景及最佳化
- 【演算法詳解】斐波那契數列 - Fibonacci sequence演算法
- [CareerCup] 17.8 Contiguous Sequence with Largest Sum 連續子序列之和最大
- JDK7u21反序列化詳解JDK
- Serializable詳解(1):程式碼驗證Java序列化與反序列化Java
- [題解]CF13C Sequence
- 吳恩達《序列模型》課程筆記(3)– Sequence models & Attention mechanism吳恩達模型筆記
- 讀論文-序列感知推薦系統(Sequence-Aware Recommender Systems)
- MySQL 序列 AUTO_INCREMENT詳解及例項程式碼MySqlREM
- 最長上升子序列LIS 詳解+變形+擴充
- 詳解電子表格中的json資料:序列化與反序列化JSON
- 自增長列和序列的區別(identity與sequence的區別)IDE
- 詳解動態規劃最長公共子序列--JavaScript實現動態規劃JavaScript
- CSS計數器(序列數字字元自動遞增)詳解CSS字元
- ORACLE SEQUENCEOracle
- Sequence recognition
- Complete the Sequence (生成完整序列數)第一次做英文c++的題C++