資料庫中SQL Sequence 使用詳細介紹
轉:http://blog.csdn.net/gameloft9/article/details/20902805
一、概述
sequence是序列號的意思,每次取的時候它會自動增加。sequence與表沒有從屬關係,與表一樣屬於使用者。
二、主要內容
1、Create Sequence語法
--首先使用者要有CREATE SEQUENCE或者CREATE ANY SEQUENCE的許可權。
CREATE SEQUENCE seqname [ INCREMENT increment ]
[ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
[ START start ] [ CACHE cache ] [ CYCLE ][order]
seqname: 序列名
increment: 遞增數,例如increment by 1就是遞增1;increment by -1就是遞減1。
minvalue: 序列最小值
maxvalue: 序列最大值,最大為27個9.
start: 序列從哪個值開始,例如start with 200就是從200開始。
cache: 快取序列個數,先取一部分序列值存入快取,可以提高效能。缺點是發生系統故障後可能導致
序列號不連續。可以設定為nocache保證不會發生序列跳動。預設值是20。
cycle: 迴圈,到達最大值後,從最小值重新開始生成序列號。可以設定為nocycle表示累加不迴圈。
order: 保證按順序申請。預設是noorder。ORDER 和 NOORDER 的區別表現在 並行服務 和獨佔服務之間 打個比方:雙CPU對同一個oracle DB 中的 ABC sequence申請序號時, 這時就有兩個請求A和B,假設A請求在前B在後, 現在ABC序列中的值為9. 如果添加了ORDER選項,那麼一定是A請求到9, B請求到10.但如果沒有新增此選項,則有可能B請求到9, A請求到10.order一般用於時間戳型別,對於主鍵則用處不大。
例子:
minvalue 1 --最小值
INCREMENT BY 1 --遞增1
START WITH 1 --從1開始
NOMAXvalue --無最大值
NOCYCLE --不迴圈
CACHE 100; --快取100個序列號
2、使用sequence
定義好sequence後,你就可以用currVal,nextVal取得值。
CurrVal:返回 sequence的當前值
NextVal:返回sequence的下一個值
select seq.currval from dual
select seq.nextval from dual
3.在Sql語句中可以使用sequence的地方:
(2)INSERT語句的子查詢中
(3)INSERT語句的values中
(4)UPDATE 的 SET中
例如:
insert into student(id,name) values(seq.Nextval,'jack');
注意:
第一次NEXTVAL返回的是初始值,隨後的NEXTVAL會返回增加後的值。CURRVAL 總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之後才能使用CURRVAL,否則報如下錯誤:
ORA-08002 序列currval尚未在會話中定義。
使用一次NEXTVAL會增加一次 SEQUENCE的值,所以如果你多次執行包含NEXTVAL的一條語句,其值就是不一樣的。
3、修改sequence引數
擁有ALTER ANY SEQUENCE 許可權才能改動sequence. 可以alter除start至以外的所有sequence引數.如果想要改變start值,必須 drop sequence再create。
例:
alter sequence SEQ maxvalue 9999999;
alter sequence SEQ cache 10;
4、Drop Sequence
DROP SEQUENCE seq;