oracle字段自增加,Oracle 中的自动增长字段
Oracle中不像MYSQL和MSSQLServer中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段。在Oracle中SEQ
环境:PLSQL Developer 7.1.5 Oracle 11.2.0 Oracle中不像MYSQL和MSSQLServer中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段。在Oracle中SEQUENCE被称为序列mssql 使用序列,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。 在使用SEQUENCE前需要首先定义一个SEQUENCE,定义SEQUENCE的语法如下: CREATESEQUENCEsequence_name INCREMENTBYstep STARTWITHstartvalue; 其中sequence_name为序列的名字,每个序列都必须有唯一的名字;startvalue参数值为起始数字,step参数值为步长,即每次自动增长时增加的值。一旦定义了SEQUENCE,你就可以用CURRVAL来取得SEQUENCE的当前值,也可以通过NEXTVAL来增加SEQUENCE,然后返回新的SEQUENCE值。比如: sequence_name.CURRVAL sequence_name.NEXTVAL 如果SEQUENCE不需要的话就可以将其删除: DROP SEQUENCE sequence_name; 下面举一个使用SEQUENCE序列实现自动增长的例子。首先创建一个名称为seq_PersonId的SEQUENCE: CREATESEQUENCEseq_PersonId MINVALUE0 INCREMENTBY1 STARTWITH0; 注:如果没加这句(MINVALUE 0),可能会出现这个错误(ORA-04006: START WITH不能小于MINVALUE)。解决方法就是指定最小值。 然后创建T_Person表: CREATETABLET_Person ( FIdNUMBER(10)PRIMARYKEY, FNameVARCHAR2(20), FAgeNUMBER(10) ); 执行上面的SQL语句后就创建成功了T_Person表,然后执行下面的SQL语句向T_Person表中插入一些数据: INSERTINTOT_Person(FId,FName,FAge) VALUES(seq_PersonId.NEXTVAL,'Tom',18); INSERTINTOT_Person(FId,FName,FAge) VALUES(seq_PersonId.NEXTVAL,'Jim',81); INSERTINTOT_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表上的触发器: CREATEORREPLACETRIGGERtrigger_personIdAutoInc BEFOREINSERTONT_Person FOREACHROW DECLARE BEGIN SELECTseq_PersonId.NEXTVALINTO:NEW.FIDFROMDUAL; ENDtrigger_personIdAutoInc; 这个触发器在T_Person中插入新记录之前触发,当触发器被触发后则从seq_PersonId中取道新的序列号然后设置给FID字段。 执行下面的SQL语句向T_Person表中插入一些数据: INSERTINTOT_Person(FName,FAge) VALUES('Wow',22); INSERTINTOT_Person(FName,FAge) VALUES('Herry',28); INSERTINTOT_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: DROPTABLET_Person; DROPSEQUENCEseq_PersonId; (编辑:瑞安网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |