在實際開發中,設計數據表的時候會把某些字段定義成一個自動增長的、唯一的流水號,例如記錄編號、日志編號等,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)
作者:碼農有道
如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!