1. 程式人生 > >資料庫中SQL Sequence 使用詳細介紹

資料庫中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一般用於時間戳型別,對於主鍵則用處不大。
例子:

     CREATE SEQUENCE seq
     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的地方:

(1)不包含子查詢、snapshot、VIEW的 SELECT 語句
(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;