Oracle 中的自动增长字段_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2949 | 回复: 0   主题: Oracle 中的自动增长字段        下一篇 
shary
注册用户
等级:新兵
经验:54
发帖:66
精华:0
注册:2011-8-31
状态:离线
发送短消息息给shary 加好友    发送短消息息给shary 发消息
发表于: IP:您无权察看 2015-6-10 15:58:53 | [全部帖] [楼主帖] 楼主

环境:PLSQL Developer 7.1.5 Oracle 11.2.0
Oracle 中不像MYSQLMSSQLServer中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段。在OracleSEQUENCE被称为序列,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
在使用SEQUENCE前需要首先定义一个SEQUENCE,定义SEQUENCE的语法如下:

CREATESEQUENCE sequence_name
INCREMENT BY step
START WITH startvalue;


其中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

CREATESEQUENCE seq_PersonId
MINVALUE 0
INCREMENT BY 1
START WITH 0;


注:如果没加这句(MINVALUE 0),可能会出现这个错误(ORA-04006: START WITH不能小于 MINVALUE)。解决方法就是指定最小值。

然后创建T_Person表:

CREATETABLE T_Person
(
FId NUMBER (10) PRIMARYKEY,
FName VARCHAR2(20),
FAge NUMBER (10)
);


执行上面的SQL语句后就创建成功了T_Person表,然后执行下面的SQL语句向T_Person表中插入一些数据:

INSERTINTO T_Person(FId,FName,FAge)
VALUES(seq_PersonId.NEXTVAL,'Tom',18);
INSERTINTO T_Person(FId,FName,FAge)
VALUES(seq_PersonId.NEXTVAL,'Jim',81);
INSERTINTO 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表上的触发器:

CREATEORREPLACETRIGGER trigger_personIdAutoInc
BEFORE INSERTON T_Person
FOR EACH ROW
DECLARE
BEGIN
SELECT seq_PersonId.NEXTVALINTO:NEW.FID FROM DUAL;
END trigger_personIdAutoInc;


这个触发器在T_Person 中插入新记录之前触发,当触发器被触发后则从seq_PersonId中取道新的序列号然后设置给FID字段。
执行下面的SQL语句向T_Person表中插入一些数据:

INSERTINTO T_Person(FName,FAge)
VALUES('Wow',22);
INSERTINTO T_Person(FName,FAge)
VALUES('Herry',28);
INSERTINTO 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

DROPTABLE T_Person;
DROPSEQUENCE seq_PersonId;


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论