Oracle 10G中關於序列使用詳解.

數據庫設計的三大範式第一條就是獨立的表結構中必須有惟一主鍵來標識表中數據.在以往微軟的SQL Server(duo版本)平臺上.手動編碼實現表中主鍵.並設定爲自增列是極其簡單.編碼以下:html

 --簡單主鍵定義以下並設置爲自增(只取出主鍵定義) 
 typeid int not null primary key identity(1,1),

Oracle中若是要設定一個獨立表結構的主鍵爲自增.其中就涉及到了 Oracle 10G中關於序列(Sequence)的使用.算法

(A)Sequence-序列的定義語法數據庫

SEquence-序列是一個數據庫項.它生成一個整數序列..Oracle中序列所生成的整數一般能夠用來填充獨立表結構中數字類型的主鍵列.來實現同SQL Server自增效果. 可是序列的定義同SQL Server下定義區別很大.在Oracle 10G官方開發手冊中顯得有些複雜,先來看看定義序列的(精簡後,若有詳細請參考官方文檔.)語法:緩存

代碼
--定義序列完整語法
Create  Sequence Sequence_Name
[Start With start_num]--自增開始初始值

[Increment by increment_num]--每次增量 
[{MaxValue maximum_num | NoMaxValue}]
[{MinValue minimum_num | NoMinValue}]
[{Cycle | NoCycle}]
[{Cache cache_num | NoCache}]
[{Order | NoOrder}] ;

 語法定義說明:數據庫設計

Sequence_Name:定義序列的名稱[有意義的命名].ide

Start With (start_num):用來定義序列的初始值.可選. 系統默認值爲1.post

Increment By(increment_num):指定序列每次自增的增量. 可選. 系統默認值一樣爲1.編碼

MaxValue(maximum_num):設定序列自增最大上限整數值.maximum_num必須大於或等於start_num即初始值.同時maximum_num必須大於序列最小下限值minimum_num.[保證有意以].spa

NoMaxValue:是系統對序列設置的默認值. 即指定升序序列的最大值爲10的27次方.降序序列的最大值爲-1NoMaxValue爲系統默認值. 同理MinValue.設計

MinValue(minimum_num):設定序列自增最小下限整數值. ,minmum_num必須小於或等於start_num即初始值. 並且minimum_num必須小於maximum_num.同理.

NoMinvalue:即便序列自增下限的默認值. 升序序列的最小值爲1, 降序序列最小爲負的10的26次方NoMinValue爲默認值.

Cycle:指定當序列即便已經達到序列自增的最大值或最小值時也繼續生成整數. 當升序序列達到最大值時. 下一個生成的值爲最小值即初始值. 當降序序列達到最小值時. 下一個生成的值最大值. 以這種規則來循環.

NoCycle:正好反之:指定到序列自增到最大值或最小值時就不能再生成整數了. NoCycle是默認值.

Cache(cache_num):指定要保留在內存中整數的個數.默認緩存的格式爲20個. 能夠緩存的整數最少爲2個. 能夠緩存的整數個數最多爲:Cell(maximum_num—minimum_num)/ABS(increment_num). 算法即:Cell(序列的最大上限值—最小下限值,)/ABS(每次自增的增量).

NoCache:指定不適用緩存整數數據.【我的建議不適用緩存來存儲數據. 當數據庫鏈接斷開後.自動清空內存數據, 致使後面插入數據序列值不連續.效果  建議在建立不適用Cache存儲 後有詳解】.

Order:確保按照請求次序生成整數 【不經常使用的設置】.只有在使用Real Application Cluster(RAC)時纔可使用Order選項設置.

Noorder:就是(以上)反之.(不在贅述) NoOrder爲系統默認值.

詳細瞭解sequence序列的詳細語法定義. 定義一個簡單的Sequence序列.並使用在表中主鍵列中實現自增.代碼以下:

1 --建立序列
2 create  sequence product_sequence
3 start with 1 --初始值默認爲1

4 increment by 1--每次增量默認爲1
5 maxvalue 10 --增量的最大上限
6 minvalue 1--增量的最小底限
7  cycle
8 nocache ;

 (B)Use Sequence-使用序列

 序列生成的是一系列整數數字.一個序列中包含兩個"僞列" ,分別爲"Currval"和"Nextval",能夠分別用來獲取該序列的當前值和下一個值.

雖然咱們在定義時指定序列product_sequence初始值爲1但並無真正初始化該值. 當在檢索序列的當前值前,必須經過檢索序列的下一個值即Nextval來對序列進行初始化操做.在選擇了product_sequence.Nextval時,該序列就被初始化爲1.以下爲實例.

 1 --初始化序列
 2 select product_sequence.nextval from  ProductType
 3 

 4 --ProductType爲代表.在初始化前 必須先建立表ProductType 以下:
 5 create table  Producttype
 6 
(
 7   typeid integer constraint producttype_pk primary key
,
 8   typename varchar(120default'CastChen Test Date!' not null
,
 9   createdate date  default sysdate not null

10 ); 

執行查詢結果以下:

上述爲第一次執行後. 序列中初始化的值爲定義時1. 若是在定義時沒有指定初始值. 默認值爲1. 成功初始化後咱們來得到當前序列的值.

1 --獲取序列當前值
2 select product_sequence.currval from ProductType

查詢結果以下:

當查詢Currval時,Nextval保持不變.而nextval只有在再次查詢nextval以得到下一個值是纔會改變. 下面作一個實例. 注意nextval和Currval前後順序.

1 --同時查看兩個僞列的值. 注意Nextval 在前 Currval在後.
2 select product_sequence.nextval, product_sequence.currval from ProductType

 查詢結果以下:

當查詢兩個值時Nextval在前. 前面提到再次查詢Nextval能夠得到序列的下一個值. 因此此處序列的當前值Currval爲2.其實能夠理解這樣這個過程:Nextval其實經過查詢來向序列賦值的,而賦值對象就是CurrvalCurrval同時又是對外訪問序列值的惟一窗口.product_sequence.currval 就直接取到了序列的當前值.同理咱們能夠把product_sequence.currval放在主鍵賦值, 而不用手動每次定義.  是否又再一次接近咱們目的.

注意咱們在定義使用了Cycle選項:即當序列自增到最大值或最小值時產生循環效果. 咱們來看下實例. 

--一直執行賦值語句 直到達到序列上限的最大值10
select product_sequence.nextval from ProductType

 執行最後結果:

 當咱們再次執行賦值語句時 結果:

 序列的值有最大上限10 又再次恢復到初始值1,實現一次循環. 若是再次執行其實同第一次執行時同樣的,Cycle實現序列在一個特定範圍內循環定義使用.

(C)使用序列填充主鍵-(核心內容)

上面作的都是準備工做, 咱們要的最後結果便是在主鍵列中經過序列來自動賦值.固然前提表的主鍵定義時數據類型必須爲整數. 在這裏我還要再次提一下Cache這個選項.在使用序列填充主鍵時,經常使用設置爲NoCache即採起默認方式. 當關閉數據庫鏈接時所緩存的值會所有丟失. 致使主鍵產生的數值不連續的現象. 使用序列來填充主鍵標識:

1 --插入數據 時 序列值代替主鍵值定義
2 insert into  ProductType(typeid,Typename,Createdate) 
3 values(product_sequence.nextval,'使用了序列定義主鍵',default)

這種方式沒必要每次添加數據時查看主鍵的數值. 懼怕插入重複數據. 而主鍵列的賦值工做徹底交給序列來作. 我只需把精力投放在其餘地方.

上面操做基本實現咱們當初預想. 但我也想提出一個問題:

在微軟的SQL Server平臺上定義獨立表結構的主鍵時. 能夠同時指定多個列共同標識爲該表的主鍵. 即若是多個合併在一塊兒比對實現主鍵惟一標識. 而Oracle 10G中序列其實就分離這種關係. 二者之間相互獨立. 也就是說主鍵的定義和主鍵賦值 是沒有關-系的. 徹底分開的. 序列只是負責獨立的對主鍵進行賦值. 而至於主鍵約束的定義 沒有關係.

(D)修改和刪除序列

能夠經過Alert  Sequence子句來修改序列, 可是我在修改序列中經常會報錯 並且很頻繁.修改序列內容有以下限制:

(1)不能修改序列的初始值

(2)序列的最小值不能大於當前值

(3)序列的最大值不能小於當前值

修改序列的增量:

1 --修改序列的增量爲2
2 alert sequence product_sequence increment by 2;

再次查詢數據結果將以每次增量爲2 增長. 若是在不使用狀況下刪除序列:

1 --刪除序列 極其簡單.
2 drop  sequence product_sequence;

當咱們添加多張表表中序列時, 咱們能夠同查詢系統中User_sequences表來獲取相關表的關於序列的詳細信息. User_sequences是字典表的一部分.

至此以上是在Oracle 10G關於序列的所有用法.

相關文章
相關標籤/搜索