Oracle序列生成器

2021-10-04 09:54:31 字數 3613 閱讀 5155

三、序列裂縫

四、修改序列

五、刪除序列

在實際開發中,設計資料表的時候會把某些字段定義成乙個自動增長的、唯一的流水號,例如記錄編號、日誌編號等,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後將不可用。

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 ;

序列建立後,用序列名.nextval獲取序列的下乙個值,用序列名.currval來檢視當前值。

在新的會話中,必須先使用nextval來產生乙個值後才可以使用currval進行檢視。

select seq_girl.nextval from dual;

-- 獲取序列seq_girl的下乙個值。

select seq_girl.currval from dual;

-- 獲取序列seq_girl的當前值

我們先建立乙個簡單的表。

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;

執行結果:

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

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

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

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

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

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

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 序列名;

Oracle序列生成器

三 序列裂縫 四 修改序列 五 刪除序列 在實際開發中,設計資料表的時候會把某些字段定義成乙個自動增長的 唯一的流水號,例如記錄編號 日誌編號等,mysql和sql server採用的是自增欄位,oracle和postgresql採用了更靈活的序列生成器。在本文中,把序列生成器簡稱為序列。建立序列的...

Oracle序列生成器

三 序列裂縫 四 修改序列 五 刪除序列 在實際開發中,設計資料表的時候會把某些字段定義成乙個自動增長的 唯一的流水號,例如記錄編號 日誌編號等,mysql和sql server採用的是自增欄位,oracle和postgresql採用了更靈活的序列生成器。在本文中,把序列生成器簡稱為序列。建立序列的...

序列號生成器

生成序列號,最大值為max val。如果達到max val,從0開始。public class serialgenerator return serialno 求整數有幾位,如234是3位。param i return private static final int getrnum int i i...