數據庫Sequence創建與使用


最近幾天使用Oracle的sequence序列號,發現對如何創建、修改、使用存在很多迷茫點,在上網尋找答案后,根據各路大神的總結,匯總下對自己的學習成果;

在Oracle中sequence就是序號,每次提取完都會自動增加,步幅固定,它與表沒有直接關系!

 

創建sequence語句:

CREATE SEQUENCE seq_name-- seq_name為計數器的名字,自定;
INCREMENT BY 1 -- 每次加幅度:1,2,3,....;
START WITH 1 -- 起始序號,以實際生產情況而定;
NOMAXvalue -- 不設置最大值,或設定最大值: maxvalue 9999;
NOCYCLE -- 一直累加,不循環; 或循環使用 cycle ;
CACHE 10; --設置緩存序列個數,如果系統down掉了或者其它情況將會導致序列不連續,也可以設置為---------NOCACHE

 

修改sequence:

Alter sequence 可以修改sequence(除起始值)步幅、最大/最小值、是否循環、緩存個數 這些參數;

例:Alter Sequence seq_name  

Increment  By  2 

Maxvalue 9999

Cycle

Cache 5;

需要修改sequence的起始值,則需要刪除原有sequence,re-create重新創建;

 

應用sequence:

sequence創建完成后,就可以使用sequence的兩個參數 currval、nextval;

currval查詢sequence的當前值:select seq_name.currval from dual;

nextval查詢sequence下一個值:select seq_name.nextval from dual;

例:對某一張表使用:insert into tb_name(id,name) values(seq_name.nextval,'下一個計數');

 

刪除sequence :

drop sequence seq_name;

 

注:

1、currval是取當前值,所以一個新的計數器sequence必須先使用nextval后才可以使用currval否則會報錯;

2、nextval是取下一個值,但第一次使用時取的是初始值,之后正常取下一個,且如果一個語句(不同的子句)里面有多個nextval,它們的取值可能是不同的;

3、如果指定CACHE值,ORACLE就可以預先在內存里面放置一些sequence,cache里面的取完后,oracle自動再取一組到cache。 

      優點:存取的快些,尤其是並發訪問時。

      缺點:使用cache或許會跳號, 比如數據庫突然不正常down掉(shutdown abort),cache中的sequence就會丟失. 所以可以在創建的時候用nocache防止這種情況。

在Oracle數據庫中,序列的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。本文我們主要介紹了序列的用法,希望能夠對您有所幫助。

Oracle數據庫中,什么是序列呢?它的用途是什么?序列(SEQUENCE)其實是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(類型為數字)。其主要的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。

創建序列需要CREATE SEQUENCE系統權限。

序列的創建語法如下:

CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [] [{CACHE n|NOCACHE}];

INCREMENT BY 用於定義序列的步長,如果省略,則默認為1,如果出現負值,則代表序列的值是按照此步長遞減的。

START WITH 定義序列的初始值(即產生的第一個值),默認為1。

MAXVALUE 定義序列生成器能產生的最大值。選項NOMAXVALUE是默認選項,代表沒有最大值定義,這時對於遞增序列,系統能夠產生的最大值是10的27次方;對於遞減序列,最大值是-1。

MINVALUE定義序列生成器能產生的最小值。選項NOMAXVALUE是默認選項,代表沒有最小值定義,這時對於遞減序列,系統能夠產生的最小值是?10的26次方;對於遞增序列,最小值是1。

CYCLE和NOCYCLE 表示當序列生成器的值達到限制值后是否循環。CYCLE代表循環,NOCYCLE代表不循環。如果循環,則當遞增序列達到最大值時,循環到最小值;對於遞減序列達到最小值時,循環到最大值。如果不循環,達到限制值后,繼續產生新值就會發生錯誤。

CACHE(緩沖)定義存放序列的內存塊的大小,默認為20。NOCACHE表示不對序列進行內存緩沖。對序列進行內存緩沖,可以改善序列的性能。

刪除序列的語法是:

DROP SEQUENCE 序列名;

其中:

刪除序列的人應該是序列的創建者或擁有DROP ANY SEQUENCE系統權限的用戶。序列一旦刪除就不能被引用了。

序列的某些部分也可以在使用中進行修改,但不能修改SATRT WITH選項。對序列的修改只影響隨后產生的序號,已經產生的序號不變。

修改序列的語法如下:

ALTER SEQUENCE 序列名 
  [INCREMENT BY n] 
  [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] 
  [{CYCLE|NOCYCLE}] 
  [{CACHE n|NOCACHE}];

*不能修改序列的初始值

創建和刪除序列

例1:創建序列:

CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;

執行結果:

序列已創建。

步驟2:刪除序列:

DROP SEQUENCE ABC;

執行結果:

序列已丟棄。

說明:以上創建的序列名為ABC,是遞增序列,增量為1,初始值為10。該序列不循環,不使用內存。沒有定義最小值,默認最小值為1,最大值為9 999 999。

序列的使用

如果已經創建了序列,怎樣才能引用序列呢?方法是使用CURRVAL和NEXTVAL來引用序列的值。

在編號的過程中,產生間隙的原因多種多樣。如果一個存儲過程從一個序列中挑選某個數字,定為本地變量,但是從來不用它,這個數字就丟失了。它將不能再返回到原序列中,結果就造成數值序列中存在一個間隙。關系型數據庫模型中不必擔心這一點。但是有時候人們在意這一點,這些人想知道是哪些數字丟失了。

調用NEXTVAL將生成序列中的下一個序列號,調用時要指出序列名,即用以下方式調用:

序列名.NEXTVAL

CURRVAL用於產生序列的當前值,無論調用多少次都不會產生序列的下一個值。如果序列還沒有通過調用NEXTVAL產生過序列的下一個值,先引用CURRVAL沒有意義。調用CURRVAL的方法同上,要指出序列名,即用以下方式調用:

序列名.CURRVAL

產生序列的值。

步驟1:產生序列的第一個值:

SELECT ABC.NEXTVAL FROM DUAL;

執行結果:

NEXTVAL —————— 10

步驟2:產生序列的下一個值:

SELECT ABC.NEXTVAL FROM DUAL;

執行結果:

NEXTVAL ——————- 11

產生序列的當前值:

SELECT ABC.CURRVAL FROM DUAL;

執行結果:

CURRVAL ——————– 11

說明:第一次調用NEXTVAL產生序列的初始值,根據定義知道初始值為10。第二次調用產生11,因為序列的步長為1。調用CURRVAL,顯示當前值11,不產生新值。Oracle的解析函數為檢查間隙提供了一種要快捷得多的方法。它們使你在使用完整的、面向集合的SQL處理的同時,仍然能夠看到下一個行(LEAD)或者前一行(LAG)的數值。

 

在某張表中,存在一個id列(整數),我們希望在添加記錄的時候,該列從1開始,自動的增長,怎么處理?

解決方式:oracle是利用“序列”(sequence)來完成的。

 

序列(sequence)介紹

oracle中,是通過使用序列(sequence)來處理自動增長列。

(1)可以為表中的列自動產生值。

(2)由用戶創建數據庫對象,並可由多個用戶共享。

(3)一般用於主鍵或唯一列。

 

創建序列基本語法:

create sequence 序列名稱

start with 開始數字

increment by 增長數字

minvalue 最小值

maxvalue 最大值

cycle

nocache

詳細說明:

start with 開始數字à從幾開始

increment by 增長à步長,每次增長幾個數

minvalue 最小值

maxvalue 最大值à可以不設置,不設置應寫為nomaxvalue,也就是無窮大

cycle  循環,也就是說當長增長到最大值后,再從最小值開始重新增長

nocache 不設緩存

 

案例說明:

create sequence my_seq --創建序列名

start with 1            --從1開始

increment by 1          --每次增長1

maxvalue 999999999      --最大值 //nomaxvalue(不設置最大值)

minvalue 1              --最小值

cycle                   --循環 //nocycle(一直累加,不循環)

nocache                 --不使用緩存

解釋:從1開始,每次增長1,最大值999999999,之后循環從1開始。

 

create sequence myseq

start with 0

increment by 1

minvalue 0

nomaxvalue

nocycle

nocache;

解釋:從0開始,每次增長1,最小值0,無窮大,不循環一直累加。

 

sequence的使用:

create table test1(id number primary key,name varchar2(32));

insert into test1 values(myseq.nextval,'abc');

insert into test1 values(myseq.nextval,'ddd');

特別說明:

1、myseq:表示序列的名字,nextval:關鍵字,表示從序列中取下一個值。

2、sequence序列是需要配合number類型的列來使用;

3、sequence序列是要在主鍵或unique列上使用的。

 

問題:

如果system用戶使用scott的sequence的序列時,sequence是從1增長還是從已使用到的數字開始?

答案:是從已使用到的數字接着增長。

 

細節說明:

看例子:

insert into emp values(my_seq.nextval,'tomcat','clerk',7566,sysdate,1200,null,20);

select my_seq.currval from dual;

注意:

第一次使用nextval返回的是初始值;

隨后的nextval會自動增加你定義的increment by值,然后返回增加后的值;

currval總是返回當前sequence的值,但是在第一次nextval初始化之后才能使用currval,否則會出錯。

使用一次nextval會增加一次sequence的值,所以如果你在同一個語句里面使用多個nextval,其值就是不一樣的。

如果指定cache值,oracle就可以預先在內存里面放置一些sequence,這樣存取的快些。cache里面的取完后,oracle自動再取一組到cache。使用cache或許會跳號,比如數據庫突然不正常down掉(shotdown abort),cache中的sequence就會丟失,所以可以在create sequence的時候用nocache防止這種情況

 

一旦定義了某個序列,你就可以用currval,nextval

currval:返回sequence的當前值

nextval:增加sequence的值,然后返回sequence值。

比如:

序列名.crrval

序列名.nextval

 

什么時候使用sequence?

不包含子查詢、snapshot/view的select的語句

insert語句的子查詢中

insert語句的values中

update的set中

如:update 表名 列值=序列名.nextval where 條件;

 

在sqlserver和mysql中都可以在定義表的時候,直接給指定自增長。

sqlserver中設置自增長

create table 表名(id int primary key identity(1,1),name varchar(32));

mysql中設置自增長

create table 表名(id int primary key auto_incrment,name varchar(32));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM