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來作爲我們的主鍵,但是在ORACLE中沒有這樣的功能,我們可以通過採取以下的功能實現自動增加ID的功能

1.首先創建sequence

create sequence seq maxincrement by 1

2.使用方法

select seqmax.nextval ID from dual

就得到了一個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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章