我們今天是要和大家一起討論的是Oracle自增ID實現,我對這一問題存在不解之處,前兩天在相關網站看見的資料,覺得挺好,就拿出來供大家分享,希望會給你帶來一些幫助在此方面。
首先,你要有一張表!
- CREATE TABLE example(
- ID Number(4) NOT NULL PRIMARY KEY,
- NAME VARCHAR(25),
- PHONE VARCHAR(10),
- ADDRESS VARCHAR(50) );
然後,你需要一個自定義的sequence
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加幾個
START WITH 1 -- 從1開始計數
NOMAXVALUE -- 不設置最大值
NOCYCLE -- 一直累加,不循環
NOCACHE -- 不建緩沖區
以上代碼完成了一個序列(sequence)的建立過程,名稱為emp_sequence,范圍是從1開始到無限大(無限大的程度是由你機器決定的),nocycle 是決定不循環,如果你設置了最大值那麼你可以用cycle 會使seq到最大之後循環.對於nocache順便說一下如果你給出了cache值那麼系統將自動讀取你的cache值大小個seq
,這樣在反復操作時會加快運行速度,但如果遭遇意外情況如當機了或Oracle死了,則下次取出的seq值將和上次的不連貫.(如果連不連貫無所謂建議用cache,因為時間就是金錢呀!跑題了!)
書接上文,你只有了表和序列還不夠,還需要一個觸發器來執行它!代碼如下:
CREATE TRIGGER "觸發器名稱" BEFORE
- INSERT ON example FOR EACH ROW WHEN (new.id is null)
- begin
- select emp_sequence.nextval into: new.id from dual;
- end;
打完收工!下面你就試試插入數據吧!
- INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei');
Oracle SEQUENCE的簡單介紹(自增長字段)- -
在Oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。
1、Create Sequence
你首先要有Create Sequence或者Create AnySequence權限,
- Create Sequence emp_sequence
INCREMENT BY 1 --每次加幾個
STARTWITH 1 --從1開始計數
NOMAXVALUE --不設置最大值
NOCYCLE --一直累加,不循環
CACHE10 ;
一旦定義了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回sequence的當前值
NEXTVAL=增加sequence的值,然後返回sequence值
比如:
- emp_sequence.CURRVAL
- emp_sequence.NEXTVAL
可以使用sequence的地方:
-不包含子查詢、snapshot、VIEW的SELECT語句
-INSERT語句的子查詢中
-INSERT語句的VALUES中
-UPDATE的SET中
可以看如下例子:
- INSERT INTO emp VALUES
- (empseq.nextval,'LEWIS','CLERK',7902,SYSDATE,1200,NULL,20);
- SELECT empseq.currval FROM DUAL;
但是要注意的是:
第一次NEXTVAL返回的是初始值;隨後的NEXTVAL會自動增加你定義的INCREMENTBY值,然後返回增加後的值。CURRVAL總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之後才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次SEQUENCE的值,所以如果你在同一個語句裡面使用多個NEXTVAL,其值就是不一樣的。明白?
如果指定CACHE值,ORACLE就可以預先在內存裡面放置一些sequence,這樣存取的快些。cache裡面的取完後,Oracle自動再取一組到cache。使用cache或許會跳號,比如數據庫突然不正常down掉(shutdownabort),cache中的sequence就會丟失.所以可以在createsequence的時候用nocache防止這種情況。
2、Alter Sequence
你或者是該sequence的owner,或者有ALTER ANYSEQUENCE權限才能改動sequence.可以alter除start至以外的所有sequence參數.如果想要改變start值,必須drop sequence再re-create.
Alter sequence的例子
- ALTER SEQUENCE emp_sequence
- INCREMENT BY 10
- MAXVALUE 10000
CYCLE--到10000後從頭開始
NOCACHE;
影響Sequence的初始化參數:
SEQUENCE_CACHE_ENTRIES=設置能同時被cache的sequence數目。
可以很簡單的Drop Sequence
- DRO SEQUENCE order_seq;
自增長及觸發器:
如何在Oracle自增ID實現類似自動增加ID的功能?
我們經常在設計數據庫的時候用一個系統自動分配的ID來作為我們的主鍵,但是在Oracle中沒有這樣的功能,我們可以通過采取以下的功能實現自動增加ID的功能
1.首先創建sequence
- create sequence seq maxincrement by 1
2.使用方法
- select seqmax.nextval ID from dual
就得到了一個ID
如果把這個語句放在觸發器中,就可以Oracle自增ID實現和mssql的自動增加ID相同的功能!
建表
- CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOT NULL,
- "TYPE" NUMBER(3) NOT NULL,
- "BODY" VARCHAR2(100) NOT NULL,
- "HITS" NUMBER(10) DEFAULT 0 NOT NULL,
- PRIMARYKEY("ID"))
- TABLESPACE "TS_SPORTS"
建序列
- CREATE SEQUENCE "SPORTS"."SPORTS_LINEUP_ID_SEQ" INCREMENT BY 1
- START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
- CACHE 50 NOORDER
建自動更新的觸發器
- CREATE OR REPLACE TRIGGER "SPORTS"."SPORTS_LINEUP_ID_TRIGGER"
- BEFORE INSERT ON "SPORTS"."LINEUP" FOR EACH ROW
- DECLARE
- next_id NUMBER;
- BEGIN
- --Get the next id number from the sequence
- SELECT sports_lineup_id_seq.NEXTVAL INTO next_id FROM dual;
- --Use the sequence number as the primarykey
- --for there cord being inserted.
- :new.id:=next_id;
- END;
建保護PRIMARYKEY的觸發器
- CREATE OR REPLACE TRIGGER "SPORTS"."LINEUP_ID_UPDATE_TRIGGER"
- BEFORE UPDATE OF "ID" ON "SPORTS"."LINEUP" FOR EACHROW
- BEGIN
- RAISE_APPLICATION_ERROR(-20000,
- 'sports_lineup_id_update_trigger:Update sof the ID fIEld'
- ||'arenotallowed.');
- END;
建刪除的觸發器
- create or replace trigger tr_bis_exc_req_del
- before delete
- on bis_exc_req
- referencing old as old new as new
- for each row
- begin
- if :old.check_status = '3' then
- raise_application_error (-20001,'*****!');
- return;
- end if;
- end;
- /
建更新的觸發器
- create or replace trigger tr_bis_exc_req_upd
- before update
- on bis_exc_req
- referencing old as old new as new
- for each row
- begin
- if :old.check_status = '3' then
- raise_application_error (-20001,'*******!');
- return;
- end if;
- end;