1、思考問題
在某張表中,存在一個id列(整數),用戶希望在添加記錄的時候,該列從1開始,自動的增長,如何處理?
2、介紹
Oracle通過序列處理自動增長列。
(1) 可以為表中的列自動產生值
(2) 由用戶創建數據庫對象,並可由多個用戶共享。
(3) 一般用於主鍵或唯一列
(4) 序列也是一種數據對象
3、定義序列
2 格式:
Create sequence 序列名
[Start with n1]
[Increment by n2]
[Minvalue n3 | nominvalue]
[Maxvalue n4 | nomaxvalue]
[cache n5 | Nocache]
[Cycle | nocycle]
[order | noorder]
2 參數說明:
l Increment:該子句是可選項,表示序列的增量。一個正數生成一個遞增的序列,一個負數生成一個遞減的序列。默認值為1。
l Minvalue:可選子句,決定序列生成的最小值。
l Maxvalue:可選子句,決定序列生成的最大值。
l Start:可選子句,指定序列的開始位置,默認情況下,遞增序列的起始值為Minvalue,遞減序列的起始值為Maxvalue。
l Cache:可選子句,該選項決定是否產生序列號預分配,並存儲在內存中。
l Cycle:可選子句,當序列號達到最大或最小值是,可以復位並繼續下去。如果達到極限,生成的下一個數據將分別是最小值或者最大值。
l Nocycle:可選子句,序列在達到最大值或最小值後,如果在視圖獲取下一個值將返回錯誤。
l Order:該選項可以保證生成序列值是按照順序產生的。
l Noorder:只保證序列值的唯一性,不保證產生序列值的順序。
4、刪除序列
2 格式:
Drop sequence序列名
5、管理序列
2 格式:
Alter sequence序列名
[Increment by n2]
[Minvalue n3 | nominvalue]
[Maxvalue n4 | nomaxvalue]
[cache n5 | Nocache]
[Cycle | nocycle]
[order | noorder]
說明:除了序列的起始值不能修改外,其他可以設置的序列子句和參數都可以被修改。對序列進行修改後,緩存中的序列值將全部丟失。通過查詢數據字典USER_SEQUENCES可以獲得序列的信息。
6、案例
1)升序序列
Create sequence myseq
Start with 1 --從1開始
Increment by 1 –每次增加1
Minvalue 1 –最小值為1
Maxvalue 30000 –最大到30000
Cycle –序列到30000後,再重新從1開始
cache 10 --表示一次產生10個號供用戶使用,可提高效率,但可能產生跳號。
2)降序序列:
Create sequence myseq
Start with -4 --從1開始
Increment by -1 –每次增加1
Minvalue -5 –最小值為1
Maxvalue -1 –最大到30000;不設最大值用nomaxvalue
Cycle –序列到30000後,再重新從1開始;不循環為nocycle
Nocache
7、序列的使用
Create table test1(id number primarykey, name varchar(32));
Insert into test1values(myseq.nextval,’abc’);
Insert into test1values(myseq.nextval,’ddd);
說明:myseq表示序列名字;nextval為關鍵字,表示增加序列的值,然後返回該值。
Currval返回序列當前值。
Select myseq.currval from dual;
說明:
(1) 使用序列的情況:
? Insert 語句的values中
? Insert語句的子查詢中 insert into test(id, name) select myseq.nextval, enamefrom emp;
? Update的set中
? 不包含子查詢、snapshot(快照)、view的select語句
(2) Currval總是返回當前sequence的值,但是在第一次nextval初始化之後才能使用currval,否則會出錯。一次nextval(無論是select還是update和insert)會增加一次sequence的值,如果在一個語句裡面使用多個nextval,其值就是不一樣的。
(3) 第一次nextval返回的是初始值;隨後的nextval會自動增加定義的incrementby的值,然後返回新值。
(4) 如果指定cache值,oracle就可以預先在內存裡面放置一些sequence,這樣存取的快些。Cache裡面的取完後,oracle自動再取一組到cache。使用cache或許會跳號,比如數據庫突然不正常down掉(shutdown/abort),cache中的sequence就會丟失,所以可以在create sequence的時候用nocache防止這種情況。
(5) Maxvalue:即指定升序序列的最大值為10的27次方;降序序列的最大值為-1。NoMaxValue為系統默認值。
(6) Minvalue:升序序列的最小值為1,降序序列最小為負的10的26次方。NoMinValue為默認值。
(7) Cycle:指定當序列即使已經達到序列自增的最大值或最小值時也繼續生成整數。當升序序列達到最大值時,下一個生成的值為最小值。當降序序列達到最小值時,下一個生成的值為最大值。以這種規則來循環。