激情五月天婷婷,亚洲愉拍一区二区三区,日韩视频一区,a√天堂中文官网8

<ul id="buwfs"><strike id="buwfs"><strong id="buwfs"></strong></strike></ul>
    <output id="buwfs"></output>
  • <dfn id="buwfs"><source id="buwfs"></source></dfn>
      <dfn id="buwfs"><td id="buwfs"></td></dfn>
      <div id="buwfs"><small id="buwfs"></small></div>
      <dfn id="buwfs"><source id="buwfs"></source></dfn>
      1. <dfn id="buwfs"><td id="buwfs"></td></dfn>
        始創(chuàng)于2000年 股票代碼:831685
        咨詢熱線:0371-60135900 注冊(cè)有禮 登錄
        • 掛牌上市企業(yè)
        • 60秒人工響應(yīng)
        • 99.99%連通率
        • 7*24h人工
        • 故障100倍補(bǔ)償
        全部產(chǎn)品
        您的位置: 網(wǎng)站首頁 > 幫助中心>文章內(nèi)容

        Oracle中序列詳解

        發(fā)布時(shí)間:  2012/8/30 17:25:17

        數(shù)據(jù)庫設(shè)計(jì)的三大范式第一條就是獨(dú)立的表結(jié)構(gòu)中必須有唯一主鍵來標(biāo)識(shí)表中數(shù)據(jù).在以往微軟的SQL Server(duo版本)平臺(tái)上.手動(dòng)編碼實(shí)現(xiàn)表中主鍵.并設(shè)定為自增列是極其簡(jiǎn)單.編碼如下:
        -
         

         --簡(jiǎn)單主鍵定義如下并設(shè)置為自增(只取出主鍵定義)
         typeid int not null primary key identity(1,1),
        在Oracle中如果要設(shè)定一個(gè)獨(dú)立表結(jié)構(gòu)的主鍵為自增.其中就涉及到了Oracle 10G中關(guān)于序列(Sequence)的使用.

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

        SEquence-序列是一個(gè)數(shù)據(jù)庫項(xiàng).它生成一個(gè)整數(shù)序列..Oracle中序列所生成的整數(shù)通常可以用來填充獨(dú)立表結(jié)構(gòu)中數(shù)字類型的主鍵列.來實(shí)現(xiàn)同SQL Server自增效果. 但是序列的定義同SQL Server下定義區(qū)別很大.在Oracle 10G官方開發(fā)手冊(cè)中顯得有些復(fù)雜,先來看看定義序列的(精簡(jiǎn)后,如有詳細(xì)請(qǐng)參考官方文檔.)語法:


        代碼
        --定義序列完整語法
        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:定義序列的名稱[有意義的命名].

        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即初始值.同時(shí)maximum_num必須大于序列最小下限值minimum_num.[保證有意以].

        NoMaxValue:是系統(tǒng)對(duì)序列設(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, 降序序列最小為負(fù)的10的26次方.NoMinValue為默認(rèn)值.

        Cycle:指定當(dāng)序列即使已經(jīng)達(dá)到序列自增的最大值或最小值時(shí)也繼續(xù)生成整數(shù). 當(dāng)升序序列達(dá)到最大值時(shí). 下一個(gè)生成的值為最小值即初始值. 當(dāng)降序序列達(dá)到最小值時(shí). 下一個(gè)生成的值最大值. 以這種規(guī)則來循環(huán).

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

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

        NoCache:指定不適用緩存整數(shù)數(shù)據(jù).【個(gè)人建議不適用緩存來存儲(chǔ)數(shù)據(jù). 當(dāng)數(shù)據(jù)庫連接斷開后.自動(dòng)清空內(nèi)存數(shù)據(jù),導(dǎo)致后面插入數(shù)據(jù)序列值不連續(xù).效果  建議在創(chuàng)建不適用Cache存儲(chǔ) 后有詳解】.

        Order:確保按照請(qǐng)求次序生成整數(shù) 【不常用的設(shè)置】.只有在使用Real Application Cluster(RAC)時(shí)才可以使用Order選項(xiàng)設(shè)置.

        Noorder:就是(以上)反之.(不在贅述) NoOrder為系統(tǒng)默認(rèn)值.

        詳細(xì)了解sequence序列的詳細(xì)語法定義. 定義一個(gè)簡(jiǎn)單的Sequence序列.并使用在表中主鍵列中實(shí)現(xiàn)自增.代碼如下:

        1 --創(chuàng)建序列
        2 create sequence product_sequence
        3 start with 1 --初始值默認(rèn)為1
        4 increment by 1--每次增量默認(rèn)為1
        5 maxvalue 10 --增量的最大上限
        6 minvalue 1--增量的最小底限
        7 cycle
        8 nocache ;
         (B)Use Sequence-使用序列

         序列生成的是一系列整數(shù)數(shù)字.一個(gè)序列中包含兩個(gè)"偽列" ,分別為"Currval"和"Nextval",可以分別用來獲取該序列的當(dāng)前值和下一個(gè)值.

        雖然我們?cè)诙x時(shí)指定序列product_sequence初始值為1但并沒有真正初始化該值. 當(dāng)在檢索序列的當(dāng)前值前,必須通過檢索序列的下一個(gè)值即Nextval來對(duì)序列進(jìn)行初始化操作.在選擇了product_sequence.Nextval時(shí),該序列就被初始化為1.如下為實(shí)例.

         1 --初始化序列
         2 select product_sequence.nextval from ProductType
         3
         4 --ProductType為表明.在初始化前 必須先創(chuàng)建表ProductType 如下:
         5 create table Producttype
         6 (
         7   typeid integer constraint producttype_pk primary key,
         8   typename varchar(120) default'CastChen Test Date!' not null,
         9   createdate date  default sysdate not null
        10 ); 執(zhí)行查詢結(jié)果如下:

         

        上述為第一次執(zhí)行后. 序列中初始化的值為定義時(shí)1. 如果在定義時(shí)沒有指定初始值. 默認(rèn)值為1.成功初始化后我們來獲得當(dāng)前序列的值.

        1 --獲取序列當(dāng)前值
        2 select product_sequence.currval from ProductType
        查詢結(jié)果如下:

         

        當(dāng)查詢Currval時(shí),Nextval保持不變.而nextval只有在再次查詢nextval以獲得下一個(gè)值是才會(huì)改變. 下面做一個(gè)實(shí)例. 注意nextval和Currval先后順序.

        1 --同時(shí)查看兩個(gè)偽列的值. 注意Nextval 在前 Currval在后.
        2 select product_sequence.nextval, product_sequence.currval from ProductType
         查詢結(jié)果如下:

         

        當(dāng)查詢兩個(gè)值時(shí)Nextval在前. 前面提到再次查詢Nextval可以獲得序列的下一個(gè)值. 所以此處序列的當(dāng)前值Currval為2.其實(shí)可以理解這樣這個(gè)過程:Nextval其實(shí)通過查詢來向序列賦值的,而賦值對(duì)象就是Currval.Currval同時(shí)又是對(duì)外訪問序列值的唯一窗口.product_sequence.currval 就直接取到了序列的當(dāng)前值.同理我們可以把product_sequence.currval放在主鍵賦值, 而不用手動(dòng)每次定義.  是否又再一次接近我們目的.

        注意我們?cè)诙x使用了Cycle選項(xiàng):即當(dāng)序列自增到最大值或最小值時(shí)產(chǎn)生循環(huán)效果. 我們來看下實(shí)例.

        --一直執(zhí)行賦值語句 直到達(dá)到序列上限的最大值10
        select product_sequence.nextval from ProductType
         執(zhí)行最后結(jié)果:

         

         當(dāng)我們?cè)俅螆?zhí)行賦值語句時(shí) 結(jié)果:

         

         序列的值有最大上限10 又再次恢復(fù)到初始值1,實(shí)現(xiàn)一次循環(huán). 如果再次執(zhí)行其實(shí)同第一次執(zhí)行時(shí)一樣的,Cycle實(shí)現(xiàn)序列在一個(gè)特定范圍內(nèi)循環(huán)定義使用.

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

        上面做的都是準(zhǔn)備工作, 我們要的最后結(jié)果即是在主鍵列中通過序列來自動(dòng)賦值.當(dāng)然前提表的主鍵定義時(shí)數(shù)據(jù)類型必須為整數(shù). 在這里我還要再次提一下Cache這個(gè)選項(xiàng).在使用序列填充主鍵時(shí),常用設(shè)置為NoCache即采取默認(rèn)方式. 當(dāng)關(guān)閉數(shù)據(jù)庫連接時(shí)所緩存的值會(huì)全部丟失. 導(dǎo)致主鍵產(chǎn)生的數(shù)值不連續(xù)的現(xiàn)象. 使用序列來填充主鍵標(biāo)識(shí):

        1 --插入數(shù)據(jù) 時(shí) 序列值代替主鍵值定義
        2 insert into ProductType(typeid,Typename,Createdate)
        3 values(product_sequence.nextval,'使用了序列定義主鍵',default)
        這種方式不必每次添加數(shù)據(jù)時(shí)查看主鍵的數(shù)值. 害怕插入重復(fù)數(shù)據(jù). 而主鍵列的賦值工作完全交給序列來做. 我只需把精力投放在其他地方.

        上面操作基本實(shí)現(xiàn)我們當(dāng)初預(yù)想. 但我也想提出一個(gè)問題:

        在微軟的SQL Server平臺(tái)上定義獨(dú)立表結(jié)構(gòu)的主鍵時(shí). 可以同時(shí)指定多個(gè)列共同標(biāo)識(shí)為該表的主鍵. 即如果多個(gè)合并在一起比對(duì)實(shí)現(xiàn)主鍵唯一標(biāo)識(shí). 而Oracle 10G中序列其實(shí)就分離這種關(guān)系. 兩者之間相互獨(dú)立. 也就是說主鍵的定義和主鍵賦值 是沒有關(guān)-系的. 完全分開的. 序列只是負(fù)責(zé)獨(dú)立的對(duì)主鍵進(jìn)行賦值. 而至于主鍵約束的定義 沒有關(guān)系.

        (D)修改和刪除序列

        可以通過Alert  Sequence子句來修改序列, 但是我在修改序列中常常會(huì)報(bào)錯(cuò) 而且很頻繁.修改序列內(nèi)容有如下限制:

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

        (2)序列的最小值不能大于當(dāng)前值

        (3)序列的最大值不能小于當(dāng)前值

        修改序列的增量:
        1 --修改序列的增量為2
        2 alert sequence product_sequence increment by 2;
        再次查詢數(shù)據(jù)結(jié)果將以每次增量為2 增加. 如果在不使用情況下刪除序列:

        1 --刪除序列 極其簡(jiǎn)單.
        2 drop  sequence product_sequence;
        當(dāng)我們添加多張表表中序列時(shí), 我們可以同查詢系統(tǒng)中User_sequences表來獲取相關(guān)表的關(guān)于序列的詳細(xì)信息. User_sequences是字典表的一部分.

        至此以上是在Oracle 10G關(guān)于序列的全部用法.


        本文出自:億恩科技【mszdt.com】

        服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

      2. 您可能在找
      3. 億恩北京公司:
      4. 經(jīng)營(yíng)性ICP/ISP證:京B2-20150015
      5. 億恩鄭州公司:
      6. 經(jīng)營(yíng)性ICP/ISP/IDC證:豫B1.B2-20060070
      7. 億恩南昌公司:
      8. 經(jīng)營(yíng)性ICP/ISP證:贛B2-20080012
      9. 服務(wù)器/云主機(jī) 24小時(shí)售后服務(wù)電話:0371-60135900
      10. 虛擬主機(jī)/智能建站 24小時(shí)售后服務(wù)電話:0371-60135900
      11. 專注服務(wù)器托管17年
        掃掃關(guān)注-微信公眾號(hào)
        0371-60135900
        Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號(hào)總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號(hào)
          1
         
         
         
         

        0371-60135900
        7*24小時(shí)客服服務(wù)熱線