Oracle中序列詳解 |
發(fā)布時間: 2012/8/30 17:25:17 |
數(shù)據(jù)庫設(shè)計的三大范式第一條就是獨立的表結(jié)構(gòu)中必須有唯一主鍵來標(biāo)識表中數(shù)據(jù).在以往微軟的SQL Server(duo版本)平臺上.手動編碼實現(xiàn)表中主鍵.并設(shè)定為自增列是極其簡單.編碼如下: --簡單主鍵定義如下并設(shè)置為自增(只取出主鍵定義) (A)Sequence-序列的定義語法 SEquence-序列是一個數(shù)據(jù)庫項.它生成一個整數(shù)序列..Oracle中序列所生成的整數(shù)通?梢杂脕硖畛洫毩⒈斫Y(jié)構(gòu)中數(shù)字類型的主鍵列.來實現(xiàn)同SQL Server自增效果. 但是序列的定義同SQL Server下定義區(qū)別很大.在Oracle 10G官方開發(fā)手冊中顯得有些復(fù)雜,先來看看定義序列的(精簡后,如有詳細請參考官方文檔.)語法:
語法定義說明: Sequence_Name:定義序列的名稱[有意義的命名]. Start With (start_num):用來定義序列的初始值.可選. 系統(tǒng)默認(rèn)值為1. Increment By(increment_num):指定序列每次自增的增量. 可選. 系統(tǒng)默認(rèn)值同樣為1. MaxValue(maximum_num):設(shè)定序列自增最大上限整數(shù)值.maximum_num必須大于或等于start_num即初始值.同時maximum_num必須大于序列最小下限值minimum_num.[保證有意以]. NoMaxValue:是系統(tǒng)對序列設(shè)置的默認(rèn)值. 即指定升序序列的最大值為10的27次方.降序序列的最大值為-1.NoMaxValue為系統(tǒng)默認(rèn)值. 同理MinValue. MinValue(minimum_num):設(shè)定序列自增最小下限整數(shù)值. ,minmum_num必須小于或等于start_num即初始值. 而且minimum_num必須小于maximum_num.同理. NoMinvalue:即使序列自增下限的默認(rèn)值. 升序序列的最小值為1, 降序序列最小為負的10的26次方.NoMinValue為默認(rèn)值. Cycle:指定當(dāng)序列即使已經(jīng)達到序列自增的最大值或最小值時也繼續(xù)生成整數(shù). 當(dāng)升序序列達到最大值時. 下一個生成的值為最小值即初始值. 當(dāng)降序序列達到最小值時. 下一個生成的值最大值. 以這種規(guī)則來循環(huán). NoCycle:正好反之:指定到序列自增到最大值或最小值時就不能再生成整數(shù)了. NoCycle是默認(rèn)值. Cache(cache_num):指定要保留在內(nèi)存中整數(shù)的個數(shù).默認(rèn)緩存的格式為20個. 可以緩存的整數(shù)最少為2個. 可以緩存的整數(shù)個數(shù)最多為:Cell(maximum_num—minimum_num)/ABS(increment_num). 算法即:Cell(序列的最大上限值—最小下限值,)/ABS(每次自增的增量). NoCache:指定不適用緩存整數(shù)數(shù)據(jù).【個人建議不適用緩存來存儲數(shù)據(jù). 當(dāng)數(shù)據(jù)庫連接斷開后.自動清空內(nèi)存數(shù)據(jù),導(dǎo)致后面插入數(shù)據(jù)序列值不連續(xù).效果 建議在創(chuàng)建不適用Cache存儲 后有詳解】. Order:確保按照請求次序生成整數(shù) 【不常用的設(shè)置】.只有在使用Real Application Cluster(RAC)時才可以使用Order選項設(shè)置. Noorder:就是(以上)反之.(不在贅述) NoOrder為系統(tǒng)默認(rèn)值. 詳細了解sequence序列的詳細語法定義. 定義一個簡單的Sequence序列.并使用在表中主鍵列中實現(xiàn)自增.代碼如下: 1 --創(chuàng)建序列 序列生成的是一系列整數(shù)數(shù)字.一個序列中包含兩個"偽列" ,分別為"Currval"和"Nextval",可以分別用來獲取該序列的當(dāng)前值和下一個值. 雖然我們在定義時指定序列product_sequence初始值為1但并沒有真正初始化該值. 當(dāng)在檢索序列的當(dāng)前值前,必須通過檢索序列的下一個值即Nextval來對序列進行初始化操作.在選擇了product_sequence.Nextval時,該序列就被初始化為1.如下為實例. 1 --初始化序列
上述為第一次執(zhí)行后. 序列中初始化的值為定義時1. 如果在定義時沒有指定初始值. 默認(rèn)值為1.成功初始化后我們來獲得當(dāng)前序列的值. 1 --獲取序列當(dāng)前值
當(dāng)查詢Currval時,Nextval保持不變.而nextval只有在再次查詢nextval以獲得下一個值是才會改變. 下面做一個實例. 注意nextval和Currval先后順序. 1 --同時查看兩個偽列的值. 注意Nextval 在前 Currval在后.
當(dāng)查詢兩個值時Nextval在前. 前面提到再次查詢Nextval可以獲得序列的下一個值. 所以此處序列的當(dāng)前值Currval為2.其實可以理解這樣這個過程:Nextval其實通過查詢來向序列賦值的,而賦值對象就是Currval.Currval同時又是對外訪問序列值的唯一窗口.product_sequence.currval 就直接取到了序列的當(dāng)前值.同理我們可以把product_sequence.currval放在主鍵賦值, 而不用手動每次定義. 是否又再一次接近我們目的. 注意我們在定義使用了Cycle選項:即當(dāng)序列自增到最大值或最小值時產(chǎn)生循環(huán)效果. 我們來看下實例. --一直執(zhí)行賦值語句 直到達到序列上限的最大值10
當(dāng)我們再次執(zhí)行賦值語句時 結(jié)果:
序列的值有最大上限10 又再次恢復(fù)到初始值1,實現(xiàn)一次循環(huán). 如果再次執(zhí)行其實同第一次執(zhí)行時一樣的,Cycle實現(xiàn)序列在一個特定范圍內(nèi)循環(huán)定義使用. (C)使用序列填充主鍵-(核心內(nèi)容) 上面做的都是準(zhǔn)備工作, 我們要的最后結(jié)果即是在主鍵列中通過序列來自動賦值.當(dāng)然前提表的主鍵定義時數(shù)據(jù)類型必須為整數(shù). 在這里我還要再次提一下Cache這個選項.在使用序列填充主鍵時,常用設(shè)置為NoCache即采取默認(rèn)方式. 當(dāng)關(guān)閉數(shù)據(jù)庫連接時所緩存的值會全部丟失. 導(dǎo)致主鍵產(chǎn)生的數(shù)值不連續(xù)的現(xiàn)象. 使用序列來填充主鍵標(biāo)識: 1 --插入數(shù)據(jù) 時 序列值代替主鍵值定義 上面操作基本實現(xiàn)我們當(dāng)初預(yù)想. 但我也想提出一個問題: 在微軟的SQL Server平臺上定義獨立表結(jié)構(gòu)的主鍵時. 可以同時指定多個列共同標(biāo)識為該表的主鍵. 即如果多個合并在一起比對實現(xiàn)主鍵唯一標(biāo)識. 而Oracle 10G中序列其實就分離這種關(guān)系. 兩者之間相互獨立. 也就是說主鍵的定義和主鍵賦值 是沒有關(guān)-系的. 完全分開的. 序列只是負責(zé)獨立的對主鍵進行賦值. 而至于主鍵約束的定義 沒有關(guān)系. (D)修改和刪除序列 可以通過Alert Sequence子句來修改序列, 但是我在修改序列中常常會報錯 而且很頻繁.修改序列內(nèi)容有如下限制: (1)不能修改序列的初始值 (2)序列的最小值不能大于當(dāng)前值 (3)序列的最大值不能小于當(dāng)前值 修改序列的增量: 1 --刪除序列 極其簡單. 至此以上是在Oracle 10G關(guān)于序列的全部用法. 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |