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;
相关文章
相关标签/搜索