天天看點

oracle中設定自增主鍵oracle中設定自增主鍵

oracle中設定自增主鍵

http://www.c114.net ( 2007/3/2 14:31 )

  首先,你要有一張表!

    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的簡單介紹(自增長字段)- -

    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的功能?

  我們經常在設計資料庫的時候用一個系統自動配置設定的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;

oracle中設定自增主鍵oracle中設定自增主鍵