環境:PLSQL Developer 7.1.5 Oracle 11.2.0web
Oracle 中不像MYSQL和MSSQLServer中那樣指定一個列爲自動增加列的方式,不過在Oracle中能夠經過SEQUENCE序列來實現自動增加字段。在Oracle中SEQUENCE被稱爲序列,每次取的時候它會自動增長,通常用在須要按序列號排序的地方。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 的SEQUENCE:ci
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;