程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle自增ID實現的具體操作步驟

Oracle自增ID實現的具體操作步驟

編輯:Oracle數據庫基礎

我們今天是要和大家一起討論的是Oracle自增ID實現,我對這一問題存在不解之處,前兩天在相關網站看見的資料,覺得挺好,就拿出來供大家分享,希望會給你帶來一些幫助在此方面。

首先,你要有一張表!

  1. CREATE TABLE example(  
  2. ID Number(4) NOT NULL PRIMARY KEY,  
  3. NAME VARCHAR(25),  
  4. PHONE VARCHAR(10),  
  5. 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

  1. INSERT ON example FOR EACH ROW WHEN (new.id is null)  
  2. begin  
  3. select emp_sequence.nextval into: new.id from dual;  
  4. end;  

打完收工!下面你就試試插入數據吧!

  1. INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei'); 

Oracle SEQUENCE的簡單介紹(自增長字段)- -

在Oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。

1、Create Sequence

你首先要有Create Sequence或者Create AnySequence權限,

  1. Create Sequence emp_sequence 

INCREMENT BY 1 --每次加幾個

STARTWITH 1 --從1開始計數

NOMAXVALUE --不設置最大值

NOCYCLE --一直累加,不循環

CACHE10 ;

一旦定義了emp_sequence,你就可以用CURRVAL,NEXTVAL

CURRVAL=返回sequence的當前值

NEXTVAL=增加sequence的值,然後返回sequence值

比如:

  1. emp_sequence.CURRVAL  
  2. emp_sequence.NEXTVAL  

可以使用sequence的地方:

-不包含子查詢、snapshot、VIEW的SELECT語句

-INSERT語句的子查詢中

-INSERT語句的VALUES中

-UPDATE的SET中

可以看如下例子:

  1. INSERT INTO emp VALUES  
  2. (empseq.nextval,'LEWIS','CLERK',7902,SYSDATE,1200,NULL,20);  
  3. 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的例子

  1. ALTER SEQUENCE emp_sequence  
  2. INCREMENT BY 10  
  3. MAXVALUE 10000  

CYCLE--到10000後從頭開始

NOCACHE;

影響Sequence的初始化參數:

SEQUENCE_CACHE_ENTRIES=設置能同時被cache的sequence數目。

可以很簡單的Drop Sequence

  1. DRO SEQUENCE order_seq; 

自增長及觸發器:

如何在Oracle自增ID實現類似自動增加ID的功能?

我們經常在設計數據庫的時候用一個系統自動分配的ID來作為我們的主鍵,但是在Oracle中沒有這樣的功能,我們可以通過采取以下的功能實現自動增加ID的功能

1.首先創建sequence

  1. create sequence seq maxincrement by 1 

2.使用方法

  1. select seqmax.nextval ID from dual 

就得到了一個ID

如果把這個語句放在觸發器中,就可以Oracle自增ID實現和mssql的自動增加ID相同的功能!

建表

  1. CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOT NULL,  
  2. "TYPE" NUMBER(3) NOT NULL,  
  3. "BODY" VARCHAR2(100) NOT NULL,  
  4. "HITS" NUMBER(10) DEFAULT 0 NOT NULL,  
  5. PRIMARYKEY("ID"))  
  6. TABLESPACE "TS_SPORTS"  

建序列

  1. CREATE SEQUENCE "SPORTS"."SPORTS_LINEUP_ID_SEQ" INCREMENT BY 1  
  2. START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE  
  3. CACHE 50 NOORDER  

建自動更新的觸發器

  1. CREATE OR REPLACE TRIGGER "SPORTS"."SPORTS_LINEUP_ID_TRIGGER"  
  2. BEFORE INSERT ON "SPORTS"."LINEUP" FOR EACH ROW  
  3. DECLARE  
  4. next_id NUMBER;  
  5. BEGIN  
  6. --Get the next id number from the sequence  
  7. SELECT sports_lineup_id_seq.NEXTVAL INTO next_id FROM dual;  
  8. --Use the sequence number as the primarykey  
  9. --for there cord being inserted.  
  10. :new.id:=next_id;  
  11. END;  

建保護PRIMARYKEY的觸發器

  1. CREATE OR REPLACE TRIGGER "SPORTS"."LINEUP_ID_UPDATE_TRIGGER"  
  2. BEFORE UPDATE OF "ID" ON "SPORTS"."LINEUP" FOR EACHROW  
  3. BEGIN  
  4. RAISE_APPLICATION_ERROR(-20000,  
  5. 'sports_lineup_id_update_trigger:Update sof the ID fIEld'  
  6. ||'arenotallowed.');  
  7. END;  

建刪除的觸發器

  1. create or replace trigger tr_bis_exc_req_del  
  2. before delete  
  3. on bis_exc_req  
  4. referencing old as old new as new  
  5. for each row  
  6. begin  
  7. if :old.check_status = '3' then  
  8. raise_application_error (-20001,'*****!');  
  9. return;  
  10. end if;  
  11. end;  
  12. /  

建更新的觸發器

  1. create or replace trigger tr_bis_exc_req_upd  
  2. before update  
  3. on bis_exc_req  
  4. referencing old as old new as new  
  5. for each row  
  6. begin  
  7. if :old.check_status = '3' then  
  8. raise_application_error (-20001,'*******!');  
  9. return;  
  10. end if;  
  11. end;   
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved