Oracle序列生成器

在實際開發中,設計數據表的時候會把某些字段定義成一個自動增長的、唯一的流水號,例如記錄編號、日誌編號等,MySQL和SQL Server採用的是自增字段,Oracle和PostgreSQL採用了更靈活的序列生成器。在本文中,把序列生成器簡稱爲序列。

一、創建序列

創建序列的語法如下:

create sequence 序列名
       [minvalue n]
       [maxvalue n]
       [increment by n]
       [start with n]
       [cache n|nocache]
       [order|noorder]
       [cycle|nocycle];

參數說明:

Oracle的序列分爲遞增序列和遞減序列,遞減序列極少使用(二十年我從未用過),爲了方便介紹,本文假設序列是遞增序列。

序列名:序列名是標誌符,建議以SEQ_打頭,例如爲T_OPERLOG表的logid字段創建一個序列,可以把它命名爲SEQ_OPERLOG(或SEQ_OPERLOG_LOGID),增加數據結構的可讀性,這是我的個人經驗,並不是Oracle數據庫的要求。

[minvalue n]:序列的最小值,缺省值是1。

[maxvalue n]:序列的最大值,缺省值是9999999999999999999999999999。

[increment by n]:序列遞增的步長,缺省值是1。

[start with n]:序列的起始值,缺省值是minvalue,如果n小於minvalue,創建序列會報語法錯誤。

[cache n|nocache]:是否採用緩存機制,nocache不採用緩存,缺省cache
20,數據庫每次會生成20個值放在緩存中,如果緩存中有數據,就不需要再查數據庫了,採用緩存機制可以提升效率。

[order|noorder]:獲取序列的時候是否按順序給值,如果多用戶一起獲取序列的值,使用order可以保證序列值的順序按訪問序列的事件排序,缺省是noorder。

[cycle|nocycle]:是否循環,缺省不循環,如果不循環,序列值到了maxvalue後將不可用。

二、序列的使用

1、創建最簡單的序列

create sequence SEQ_GIRL;

執行以上SQL語句會在數據庫中生成一個名字爲SEQ_GIRL的序列,除了序列名,其它的參數都採用缺省值,相當於以下SQL:

create sequence SEQ_GIRL 
       minvalue 1 
       maxvalue 9999999999999999999999999999 
       increment by 1 
       start with 1 
       cache 20 
       noorder  
       nocycle ;

2、在dual虛表使用序列

序列創建後,用序列名.nextval獲取序列的下一個值,用序列名.currval來查看當前值。

在新的會話中,必須先使用nextval來產生一個值後纔可以使用currval進行查看。

select SEQ_GIRL.nextval from dual;     -- 獲取序列SEQ_GIRL的下一個值。
select SEQ_GIRL.currval from dual;     -- 獲取序列SEQ_GIRL的當前值

3、在SQL語句中使用序列

我們先創建一個簡單的表。

create table T_GIRL
(
  name    varchar2(10),     -- 姓名
  keyid   number(10)        -- 記錄編號
);

1)在insert語句中使用序列。

insert into T_GIRL(name,keyid) values('西施'  ,SEQ_GIRL.nextval);
insert into T_GIRL(name,keyid) values('妲已'  ,SEQ_GIRL.nextval);
insert into T_GIRL(name,keyid) values('楊玉環',SEQ_GIRL.nextval);
insert into T_GIRL(name,keyid) values('李師師',SEQ_GIRL.nextval);

執行結果:

在這裏插入圖片描述

2)在update語句中使用序列。

update T_GIRL set keyid=SEQ_GIRL.nextval+100;

執行結果:

在這裏插入圖片描述

三、序列裂縫

1、序列不產生事務

序列的nextval方法不會產生事務,事務回滾命令rollback不會恢復序列的值,我們來做一個測試。

1)先獲取序列的當前值。

在這裏插入圖片描述

2)執行一條不會成功的SQL語句。

在這裏插入圖片描述

3)再獲取序列的當前值。

在這裏插入圖片描述

2、序列裂縫

如果用序列的值作爲表中某個字段的值,這個字段的值可能會出現不連續的情況。因爲序列的值不連續,有裂縫。

序列在下列情況下出現裂縫:

1)執行SQL語句失敗;

2)事務回滾;

3)序列緩存;

4)多個表同時使用同一序列;

5)其它異常。

四、修改序列

修改序列的語法如下:

alter sequence 序列名
     [minvalue n]
     [maxvalue n]
     [increment by n]
     [start with n]
     [cache n|nocache]
     [order|noorder]
     [cycle|nocycle];

修改序列的參數與創建序列的參數相同,不同的是,修改序列時沒有缺省值。

alter sequence SEQ_GIRL increment by 10 cycle

五、刪除序列

刪除序列的語法如下:

drop sequence 序列名;

六、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道

如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章