=============================================================
ORACLE SEQUENCE的簡單介紹(自增長字段)- -
from:http://ub1010.51.net/BBS/user_file/2002-04-10/1018438701.htm
在oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。
1、CreateSequence
你首先要有CREATESEQUENCE或者CREATEANYSEQUENCE權限,
CREATESEQUENCEemp_sequence
INCREMENTBY1--每次加幾個
STARTWITH1--從1開始計數
NOMAXVALUE--不設置最大值
NOCYCLE--一直累加,不循環
CACHE10;一旦定義了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回sequence的當前值
NEXTVAL=增加sequence的值,然后返回sequence值
比如:
emp_sequence.CURRVAL
emp_sequence.NEXTVAL可以使用sequence的地方:
-不包含子查詢、snapshot、VIEW的SELECT語句
-INSERT語句的子查詢中
-NSERT語句的VALUES中
-UPDATE的SET中可以看如下例子:
INSERTINTOempVALUES
(empseq.nextval,'LEWIS','CLERK',7902,SYSDATE,1200,NULL,20);SELECTempseq.currvalFROMDUAL;但是要注重的是:
-第一次NEXTVAL返回的是初始值;隨后的NEXTVAL會自動增加你定義的INCREMENTBY值,然后返回增加后的值。CURRVAL總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次SEQUENCE的值,所以假如你在同一個語句里面使用多個NEXTVAL,其值就是不一樣的。明白?-假如指定CACHE值,ORACLE就可以預先在內存里面放置一些sequence,這樣存取的快些。cache里面的取完后,oracle自動再取一組到cache。使用cache或許會跳號,比如數據庫忽然不正常down掉(shutdownabort),cache中的sequence就會丟失.所以可以在createsequence的時候用nocache防止這種情況。2、AlterSequence
你或者是該sequence的owner,或者有ALTERANYSEQUENCE權限才能改動sequence.可以alter除start至以外的所有sequence參數.假如想要改變start值,必須dropsequence再re-create.
Altersequence的例子
ALTERSEQUENCEemp_sequence
INCREMENTBY10
MAXVALUE10000
CYCLE--到10000后從頭開始
NOCACHE;
影響Sequence的初始化參數:
SEQUENCE_CACHE_ENTRIES=設置能同時被cache的sequence數目。可以很簡單的DropSequence
DROPSEQUENCEorder_seq;
好吧,就到這里。
-------------------------------------------------------------
自增長及觸發器:
如何在Oracle中實現類似自動增加ID的功能?
整理編輯:Chinaasp我們經常在設計數據庫的時候用一個系統自動分配的ID來作為我們的主鍵,但是在ORACLE中沒有這樣的功能,我們可以通過采取以下的功能實現自動增加ID的功能
1.首先創建sequence
createsequenceseqmaxincrementby1
2.使用方法
selectseqmax.nextvalIDfromdual
就得到了一個ID
假如把這個語句放在觸發器中,就可以實現和MSSQL的自動增加ID相同的功能!
-------------------------------------------------------------------------###建表###CREATETABLE"SPORTS"."LINEUP"("ID"NUMBERNOTNULL,"TYPE"
NUMBER(3)NOTNULL,"BODY"VARCHAR2(100)NOTNULL,"HITS"NUMBER(
10)DEFAULT0NOTNULL,PRIMARYKEY("ID"))
TABLESPACE"TS_SPORTS"###建序列###CREATESEQUENCE"SPORTS"."SPORTS_LINEUP_ID_SEQ"INCREMENTBY1
STARTWITH1MAXVALUE1.0E28MINVALUE1NOCYCLE
CACHE50NOORDER###建自動更新的觸發器###CREATEORREPLACETRIGGER"SPORTS"."SPORTS_LINEUP_ID_TRIGGER"
BEFOREINSERT
ON"SPORTS"."LINEUP"
FOREACHROW
DECLARE
next_idNUMBER;
BEGIN
--Getthenextidnumberfromthesequence
SELECTsports_lineup_id_seq.NEXTVAL
INTOnext_id
FROMdual;
--Usethesequencenumberastheprimarykey
--fortherecordbeinginserted.
:new.id:=next_id;
END;###建保護PRIMARYKEY的觸發器###CREATEORREPLACETRIGGER"SPORTS"."LINEUP_ID_UPDATE_TRIGGER"
BEFOREUPDATEOF"ID"ON"SPORTS"."LINEUP"
FOREACHROW
BEGIN
RAISE_application_ERROR(-20000,
'sports_lineup_id_update_trigger:UpdatesoftheIDfield'
||'arenotallowed.');
END;
新聞熱點
疑難解答