文档章节

Oracle 中的自动增长字段

Sheamus
 Sheamus
发布于 2015/04/22 14:55
字数 728
阅读 110
收藏 6

环境:PLSQL Developer 7.1.5 Oracle 11.2.0

 

Oracle 中不像MYSQLMSSQLServer中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段。在OracleSEQUENCE被称为序列,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

在使用SEQUENCE前需要首先定义一个SEQUENCE,定义SEQUENCE的语法如下:

CREATE SEQUENCE 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

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


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

然后创建T_Person表:

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


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

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;

 

本文转载自:http://blog.csdn.net/justdb/article/details/7525240

共有 人打赏支持
Sheamus

Sheamus

粉丝 45
博文 213
码字总数 29920
作品 0
海淀
程序员
私信 提问
MySQL与Oracle 差异比较之一数据类型

编号 ORACLE MYSQL 注释 1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型; MYSQL有很多类int型,tinyint mediumint bigint等,不同的int宽度不一样...

竹竿先生
2016/10/18
11
0
Oracle与MySQL性能比较

oracle优点: 1、处理速度快,非常快 2、安全级别高。支持快闪以及完美的恢复,即使硬件坏了 也可以恢复到故障发前的1s 3、几台数据库做负载数据库,可以做到30s以内故障转移 4、网格控制,以...

谢思华
2013/11/15
0
1
mysql与oracle区别

编号 ORACLE MYSQL 注释 1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型; MYSQL有很多类int型,tinyint mediumint bigint等,不同的int宽度不一样...

architect刘源源
2018/03/08
1
0
Mysql,SqlServer,Oracle主键自动增长的设置

1、把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如: customers(id auto_increment , name ( customers(name) i...

北方攻城师
2014/07/29
0
0
Mysql、Sql Server、Oracle主键自动增长的设置

1、把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如: create table customers(id int auto_increment primary k...

Junn
2014/03/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux下端口转发工具rinetd介绍

linux下简单好用的工具rinetd,实现端口映射/转发/重定向,针对TCP协议,不支持UDP。 官网地址 http://www.boutell.com/rinetd 里面介绍及使用齐全。 使用场景举例: 阿里云内网Redis连接问题...

ouhoo
15分钟前
1
0
Oracle学习日志-5(算数运算符,比较运算符和逻辑运算符)

因为有编程基础,所以对于这一章还是很好理解,只需要注意对NULL的运算。 操作的表格 算数运算符 查询商品名字和商品售价,并商品售价乘2 SELECT product_name,sale_price * 2 AS "sale_pri...

白话
28分钟前
1
0
搜索引擎(Lucene介绍、分词器详解)

Lucene介绍 Lucene简介 最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎,部分文本分词引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简...

这很耳东先生
32分钟前
0
0
quartz详细介绍

quartz常用api Scheduler 调度程序交互的主要API。 Job 希望由调度程序执行的组件实现的接口。 JobDetail 用于定义作业的实例。 JobDataMap 可以包含不限量的序列化数据,在job运行的时候可以...

大笨象会跳舞吧
33分钟前
1
0
kotlin使用jackson序列化enum

默认情况下,我们序列化与反序列化enum是它的name,事实上大部分情况下我们需要序列化的是我们自定义的value,那应该怎么做呢? 这种情况下我们就需要@JsonValue与@JsonCreator data class U...

weidedong
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部