溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle中的小序列

發(fā)布時(shí)間:2020-09-17 16:25:44 來(lái)源:網(wǎng)絡(luò) 閱讀:729 作者:長(zhǎng)路慢 欄目:關(guān)系型數(shù)據(jù)庫(kù)

    話說(shuō)序列很少人知道,因?yàn)?a title="Mysql" target="_blank" href="http://www.kemok4.com/mysql/">Mysql和sql server都有自動(dòng)增長(zhǎng)字段(如ID主鍵自動(dòng)增長(zhǎng)的整數(shù)),而Oracle卻沒(méi)有提供該用法,那么Oracle提供了更加靈活方便的策略-建立對(duì)象序列。

    序列創(chuàng)建之后也是真真實(shí)實(shí)存在的,存在我們的磁盤(pán)上,并可以適用場(chǎng)合調(diào)用,序列總是從指定的長(zhǎng)度開(kāi)始,創(chuàng)建了之后可以按照指定步長(zhǎng)進(jìn)行累加,獲得新的整數(shù)

    格式:

        create sequence emp_seq

    解釋:

        創(chuàng)建一個(gè)序列,經(jīng)常會(huì)用后綴seq來(lái)識(shí)別的

    格式:

        select object_name,object_type,status from user_objects where lower(object_name)='emp_seq';

    解釋:

        竟然是正兒八經(jīng)存在的對(duì)象,那么我們就可以通過(guò)數(shù)據(jù)庫(kù)user_objects.

    格式:

        select sequence_name,min_value,max_value,increment_by from user_sequences where lower(sequence_name)='emp_seq';

    解釋:

        用來(lái)查看我們創(chuàng)建的序列詳細(xì)信息的,我們通過(guò)這個(gè)突然發(fā)現(xiàn),還能看最大值,最小值,每次增長(zhǎng)的步長(zhǎng).

  使用序列

      創(chuàng)建不用等于白創(chuàng),那么使用前先要理解兩個(gè)值,第一個(gè)currval,第二個(gè)nextval,從英語(yǔ)意思來(lái)看也很清晰,currval獲取當(dāng)前值,nextval獲取下一個(gè)值,每次調(diào)用nextval都會(huì)使當(dāng)前的序列增加單位步長(zhǎng)(默認(rèn)是1)

      調(diào)用序列這兩個(gè)屬性方法為seq.currval和seq.nextval,第一次使用序列,注意哈,要先調(diào)用next的屬性,否則會(huì)報(bào)錯(cuò)的!

    格式:

        select emp_seq.nextval from dual;

    解釋:

        我們用虛表dual來(lái)作為seq.nextval的from源,單行輸出顯示,這時(shí)候結(jié)果會(huì)是1.

  因?yàn)閚extval的值是默認(rèn)整張的,所以我們要保證表ID為主鍵

     格式:

        alter table student_name modify(id number primary key);

     格式:

        insert into student(id,name) values(emp_seq,'你好',);

     解釋:

        假如student表中已有數(shù)據(jù),我們插入id時(shí)候直接調(diào)用創(chuàng)建的序列你會(huì)驚奇的發(fā)現(xiàn),失?。。?!怎么回事,我們用select emp_seq.currval from dual;--發(fā)現(xiàn)數(shù)據(jù)是2,表中已經(jīng)有2了當(dāng)然不行了,怎么辦也不可能把原有的數(shù)據(jù)(這一列刪除掉),數(shù)據(jù)量小還可以用用,麻煩不說(shuō),顯示不出序列的威力!下面我們介紹怎么設(shè)置初始值,加入本表id值已經(jīng)1000條數(shù)據(jù),我們讓他從1000開(kāi)始默認(rèn)自增不是更好更高效!

     格式:

        drop sequence emp_seq;--刪除原來(lái)的序列

        create sequence emp_seq start with 1001;

     解釋:

        關(guān)鍵詞start with 英語(yǔ)單詞理解就是起始,那么意思就是說(shuō)這個(gè)序列從1001開(kāi)始自動(dòng)增加(默認(rèn)是1),插入的時(shí)候起始值是1001這樣就可以根據(jù)我們的需求來(lái)使用序列,是不是很方便簡(jiǎn)單高效。

     格式:

        alter sequence emp_seq minvalue 8888;--修改最小值,注意當(dāng)前修改的最小值不能大于原表中的數(shù)值(1001)??!

        alter sequence emp_seq maxvalue 9999;--修改最大只

    格式:

        alter sequence emp_seq increment by 5;

    解釋:

        這就是我們前面一直給大家提到的默認(rèn)增長(zhǎng)的步調(diào),就是說(shuō)每一次插入id值默認(rèn)自動(dòng)增長(zhǎng)多少。

        這個(gè)地方要注意設(shè)置最大值的問(wèn)題,如果我最大值是20的話,從1開(kāi)始每次增加5,最大只能到17,第四次就會(huì)超出最大值報(bào)錯(cuò),這個(gè)的話大家一下就會(huì)明白。

        那么當(dāng)我超出最大值就不可以,超出最大值就讓他變成最小值,重新循環(huán),可以的,我們是操控者,只要我們?cè)敢猓偷每梢?,下面介紹一個(gè)關(guān)鍵字來(lái)替我們?nèi)?zhí)行這個(gè)操作。

    格式:

        create sequence emp_seq

        start with 5

        minvalue 1

        maxvalue 30

        incremenet by 1

        /--創(chuàng)建結(jié)束

    這時(shí)候我們算是吧前面學(xué)的參數(shù)都用上了,看一看其實(shí)也很簡(jiǎn)單啊,么點(diǎn)難度,我們開(kāi)始多次nextval屬性值,直到用currval看當(dāng)前值最大值為30,當(dāng)我們?cè)谑褂胣extval的時(shí)候就會(huì)神奇的發(fā)現(xiàn)變成了1.

    格式:

        alter sequence emp_seq cycle;--開(kāi)啟

        alter sequence emp_sql nocycle;--關(guān)閉

    緩存,什么是緩存,緩存是更好的讀數(shù)據(jù),速度比內(nèi)存都要快很多,那么序列也有緩存,大量數(shù)據(jù)能有緩存效果對(duì)于數(shù)據(jù)庫(kù)整體來(lái)說(shuō)無(wú)疑是一個(gè)性能極大的提升。

        那么序列的cache,每次利用nextval,并非直接操作,而一次性獲取多個(gè)列表的緩存,從緩存中抓取數(shù)值,而且依賴于currval和步長(zhǎng)increment.

        定義存放序列的內(nèi)存塊的大小,預(yù)先生成序列號(hào),存放在內(nèi)存塊當(dāng)中,用下一個(gè)序號(hào)給予快速的相應(yīng),可以更快的響應(yīng),當(dāng)一組用完之后會(huì)再生成一組,這樣可以提高生成序列號(hào)的效率,默認(rèn)值20。

        格式:

            alter sequence emp_seq cache 10;

        解釋:

            設(shè)置緩存區(qū)大小

    昨天在工作中,在表中添加了一個(gè)序列id,當(dāng)時(shí)數(shù)據(jù)量比較小,利用表格然后插入到數(shù)據(jù)表列,如果數(shù)據(jù)量這個(gè)方法不可行而且特別麻煩,那么今天學(xué)習(xí)的序列就派上了大用場(chǎng)!

    小序列并不簡(jiǎn)單,能用好、用到正地方確實(shí)要很大學(xué)問(wèn),希望大家一起學(xué)以致用多多實(shí)戰(zhàn)。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI