Oracle 中的自動增加字段

環境:PLSQL Developer 7.1.5 Oracle 11.2.0web

 

Oracle 中不像MYSQLMSSQLServer中那樣指定一個列爲自動增加列的方式,不過在Oracle中能夠經過SEQUENCE序列來實現自動增加字段。在OracleSEQUENCE被稱爲序列,每次取的時候它會自動增長,通常用在須要按序列號排序的地方。sql

在使用SEQUENCE前須要首先定義一個SEQUENCE,定義SEQUENCE的語法以下:spa

CREATE SEQUENCE sequence_name 

INCREMENT BY step 

START WITH startvalue;

其中sequence_name爲序列的名字,每一個序列都必須有惟一的名字;startvalue參數值爲起始數字,step參數值爲步長,即每次自動增加時增長的值。一旦定義了SEQUENCE,你就能夠用CURRVAL來取得SEQUENCE的當前值,也能夠經過NEXTVAL來增長SEQUENCE,而後返回 新的SEQUENCE值。好比:code

sequence_name.CURRVAL
sequence_name.NEXTVAL


若是SEQUENCE不須要的話就能夠將其刪除:orm

DROP SEQUENCE sequence_name;排序

下面舉一個使用SEQUENCE序列實現自動增加的例子。首先建立一個名稱爲seq_PersonId SEQUENCEci

CREATE SEQUENCE seq_PersonId     
MINVALUE 0    
INCREMENT BY 1     
START WITH 0;


注:若是沒加這句(MINVALUE 0),可能會出現這個錯誤(ORA-04006: START WITH不能小於 MINVALUE)。解決方法就是指定最小值。it

而後建立T_Person表:form

CREATE TABLE T_Person     
(    
  
    FId NUMBER (10) PRIMARY KEY,    
  
    FName VARCHAR2(20),    
  
    FAge NUMBER (10)   
  
);


執行上面的SQL語句後就建立成功了T_Person表,而後執行下面的SQL語句向T_Person表中插入一些數據:class

INSERT INTO T_Person(FId,FName,FAge)    
VALUES(seq_PersonId.NEXTVAL,'Tom',18);    
  
INSERT INTO T_Person(FId,FName,FAge)   
VALUES(seq_PersonId.NEXTVAL,'Jim',81);  
   
  
INSERT INTO T_Person(FId,FName,FAge)    
VALUES(seq_PersonId.NEXTVAL,'Kerry',33);


注意這裏的INSERT語句沒有爲FId字段設定任何值,由於DBMS會自動爲FId字段設定值。執行完畢後查看T_Person表中的內容:

FID  FNAME  FAGE

1  Tom  18

2  Jim  81

3  Kerry  33

使用SEQUENCE實現自動增加字段的缺點是每次向表中插入記錄的時候都要顯式的到SEQUENCE中取得新的字段值,若是忘記了就會形成錯誤。爲了解決這個問題,咱們可使用觸發器來解決,建立一個T_Person表上的觸發器:

CREATE OR REPLACE TRIGGER trigger_personIdAutoInc   
  
   BEFORE INSERT ON T_Person   
  
   FOR EACH ROW    
  
DECLARE    
  
BEGIN    
  
   SELECT seq_PersonId.NEXTVAL INTO :NEW.FID FROM DUAL;   
  
END trigger_personIdAutoInc;


這個觸發器在T_Person 中插入新記錄以前觸發,當觸發器被觸發後則從seq_PersonId中取道新的序列號而後設置給FID字段。

執行下面的SQL語句向T_Person表中插入一些數據:

INSERT INTO T_Person(FName,FAge)   
  
VALUES('Wow',22);      
  
INSERT INTO T_Person(FName,FAge)   
  
VALUES('Herry',28);     
  
INSERT INTO T_Person(FName,FAge)   
  
VALUES('Gavin',36);


注意在這個SQL語句中無需再爲FId字段賦值。執行完畢後查看T_Person表中的內容:

FID  FNAME  FAGE

1  Tom  18

2  Jim  81

3  Kerry  33

4  Wow  22

5  Herry  28

7  Gavin  36

這個例子講解完了,請刪除T_Person表以及SEQUENCE

DROP TABLE T_Person;     
DROP SEQUENCE seq_PersonId;
相關文章
相關標籤/搜索