如果你经常使用 MySQL,你肯定对 AUTO_INCREMENT 非常熟悉,因为经常要用到它。

一、什么是自增列 ?

自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段,这样每次增加一行时,不用指该字段的值,它就会自动增加,而且是唯一的。

当在 MySQL 中定义列时,我们可以指定一个名为 AUTO_INCREMENT 的参数。然后,每当将新值插入此表中时,放入此列的值比最后一个值加 1。

但很不幸,Oracle 没有 AUTO_INCREMENT 功能。 那要如何在Oracle中做到这一点呢?

二、在 Oracle 11g 中设置自增字段

1. 创建表

首先创建一张用于测试的表:

CREATE TABLE "TEST" (

ID NUMBER(11) PRIMARY KEY,

NAME VARCHAR2(50BYTE) NOT NULL

);

2. 创建序列

然后创建一个名为 TEST_ID_SEQ 的序列(序列名称自己随意设定):

CREATE SEQUENCE TEST_ID_SEQ

INCREMENT BY 1

START WITH 100

MAXVALUE 999999999

NOCYCLE

NOCACHE;

如果要删除序列,可以使用下面的 SQL 命令:

DROP SEQUENCE TEST_ID_SEQ;

对 SEQUENCE 的一些说明:INCREMENT BY 用于指定序列增量(默认值:1),如果指定的是正整数,则序列号自动递增,如果指定的是负数,则自动递减。

START WITH 用于指定序列生成器生成的第一个序列号,当序列号顺序递增时默认值为序列号的最小值,当序列号顺序递减时默认值为序列号的最大值。

MAXVALUE 用于指定序列生成器可以生成的组大序列号(必须大于或等于 START WITH,并且必须大于 MINVALUE),默认为 NOMAXVALUE。

MINVALUE 用于指定序列生成器可以生成的最小序列号(必须小于或等于 START WITH,并且必须小于 MAXVALUE),默认值为 NOMINVALUE。

CYCLE 用于指定在达到序列的最大值或最小值之后是否继续生成序列号,默认为 NOCYCLE。

CACHE 用于指定在内存中可以预分配的序列号个数(默认值:20)。

到这一步其实就已经可以实现字段自增,只要插入的时候,将 ID 的值设置为序列的下一个值 TEST_ID_SEQ.NEXTVAL 就可以了:

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (TEST_ID_SEQ.NEXTVAL, 'name1');

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (TEST_ID_SEQ.NEXTVAL, 'name2');

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (TEST_ID_SEQ.NEXTVAL, 'name3');

SQL> SELECT * FROM "TEST";

ID NAME

--- ------100name1

101name2

102name3

为了简化插入操作,我们还可以创建一个触发器,当将数据插入到 “TEST” 表的时候,自动将最新的 ID 插入进去。

3. 创建触发器

CREATE OR REPLACE TRIGGER TEST_ID_SEQ_TRG

BEFORE INSERT ON "TEST"

FOR EACH ROW

WHEN (NEW."ID" IS NULL)

BEGIN

SELECT TEST_ID_SEQ.NEXTVAL

INTO :NEW."ID"

FROM DUAL;

END;

这样的话,每次写插入语句,只需要将 ID 字段的值设置为 NULL 它就会自动递增了:

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (NULL, 'name4');

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (NULL, 'name5');

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (NULL, 'name6');

SQL> SELECT * FROM "TEST";

ID NAME

--- ------100name1

101name2

102name3

103name4

104name5

105name6

4. 一些值得注意的地方

4.1 插入指定 ID

如果某条插入语句指定了 ID 的值如:

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (1000, 'name1001');

SQL> SELECT * FROM "TEST";

ID NAME

--- ------100name1

101name2

102name3

103name4

104name5

1000name1001

那么下次 ID 还是会在原来的基础上继续增加:

SQL> INSERT INTO "TEST" ("ID", "NAME") VALUES (NULL, 'name1001');

SQL> SELECT * FROM "TEST";

ID NAME

--- ------100name1

101name2

102name3

103name4

104name5

1000name1001

但当序列的值到了 1000 的时候,如果 ID 允许重复,就会有两行记录 ID 都为 1000。

但如果 ID 设置为了主键,如本文的例子 ID NUMBER(11) PRIMARY KEY,则插入就会报错:

Error : ORA-00001: unique constraint (SOFTWARE.SYS_C0014995) violated

4.2 字段加引号

在 SQL 语句中,字段最好都加上引号,不然可能会报错:

Error : ORA-00900: invalid SQL statement

或:

ORA-24344: Success with Compilation Error

4.3 SQUENCE第一次 NEXTVAL 返回的是初始值;随后的 NEXTVAL 会自动增加 INCREMENT BY 对应的值,然后返回增加后的值。

CURRVAL 总是返回当前 SEQUENCE 的值,但是在第一次 NEXTVAL 初始化之后才能使用 CURRVAL ,否则会出错。

一次 NEXTVAL 会增加一次 SEQUENCE 的值,所以如果在同一个语句里面使用多个NEXTVAL,其值就是不一样的。

如果指定 CACHE 值,Oracle 就可以预先在内存里面放置一些 SEQUENCE,这样存取的快些。 CACHE 里面的取完后,Oracle 自动再取一组到 CACHE。

但使用 CACHE 或许会跳号,比如数据库突然不正常关闭(shutdown abort), CACHE 中的 SEQUENCE 就会丢失。所以可以在 CREATE SEQUENCE 的时候用 NOCACHE 防止这种情况。

4.4 性能

在数据库操作中,触发器的使用耗费系统资源相对较大。如果对于表容量相对较小的表格我们可以忽略触发器带来的性能影响。

考虑到大表操作的性能问题,需要尽可能的减少触发器的使用。对于以上操作,就可以抛弃触发器的使用,直接手动调用序列函数即可,但这样可能在程序维护上稍微带来一些不便。

三、在 Oracle 12c 中设置自增字段

在 Oracle 12c 中设置自增字段就简单多了,因为 ORacle 12c 提供了 IDENTITY 属性:

CREATE TABLE "TEST" (

ID NUMBER(11) GENERATED BY DEFAULT ON NULL AS IDENTITY,

NAME VARCHAR2(50BYTE) NOT NULL

);

这样就搞定了!和 MySQL 一样简单!???

四、总结

所以如上所属,在 Oracle 中设置自增字段,需要根据不同的版本使用不同的方法:在 Oracle 11g 中,需要先创建序列(SQUENCE)再创建一个触发器(TRIGGER)。

在 Oracle 12c 中,只需要使用 IDENTITY 属性就可以了。

oracle 主键自增函数_在 Oracle 中设置自增列相关推荐

  1. oracle 主键自增函数_oracle 主键自增

    注意:new后面的和主键对应 CREATE TABLE item ( iid INT, title VARCHAR2(50), CONSTRAINT pk_iid PRIMARY KEY (iid) ...

  2. 解决oracle主键问题,解决renren-security使用oracle主键问题

    解决renren-security使用oracle主键问题 分享 未结 1  808 LancCJ 2019-11-04 悬赏:20积分 下载项目,直接配置oracle数据库,在配置文件中使用 id ...

  3. oracle增加字段为主键自增_在 Oracle 中设置自增列

    如果你经常使用 MySQL,你肯定对 AUTO_INCREMENT 非常熟悉,因为经常要用到它. 一.什么是自增列 ? 自增列是数据库中值随插入的每个行自动增加的一列.它最常用于主键或 ID 字段,这 ...

  4. oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程

    在设计数据库表的时候发现Oracle没有自增主键的设置,Google了解到Oracle本身并不支持自增主键,需要通过序列(Sequence)和触发器(Trigger)实现. 创建表Student Cr ...

  5. oracle主键 唯一索引的区别,Oracle 主键、唯一键与唯一索引的区别

    一般,我们看到术语"索引"和"键"交换使用,但实际上这两个是不同的.索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念.键代表创建来实施业务规则的完整性约 ...

  6. 新增一个主键自增长_为什么InnoDB宜用自增主键

    前言 领导:既然自增数字主键会导致主备同步时主键冲突,自增主键能不能砍掉? 答:自增主键主要是技术上提升效率,键冲突可以考虑备库插入时不指定主键值,或者binlog改成row模式,而且, 公司规范:如 ...

  7. oracle 主键自增函数_oracle 实现主键自增

    -- 创建表 drop table test; create table test(id number(10), name varchar2(10)); -- 创建对列 drop sequence s ...

  8. oracle主键必须加分区字段,oracle分区表和主键关系

     --全局唯一索引 create table test_par1 ( tdate   varchar2(8) primary key ) partition by range ( tdate ) ...

  9. oracle主键自增

    前言 众所周知,MySQL数据库的主键自增设置非常简单,任何一个常用的可视化工具都支持,只要打一下勾就可以开启主键自增了.然而Oracle并没有那么简单,它需要执行几个简短语句. 操作步骤 为了方便讲 ...

  10. Mysql,SqlServer,Oracle主键自动增长的设置

    Mysql,SqlServer,Oracle主键自动增长的设置 参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1.把主键定义为 ...

最新文章

  1. 枚举类型(C# 编程指南)
  2. H5调用手机拨打电话的功能
  3. 计算机网络ipv4到ipv6怎么实现,论计算机网络协议IPV4到IPV6的过渡策略|房屋搬迁过渡协议...
  4. hive建表语句_Hive数据如何同步到MaxCompute之实践讲解
  5. 配置zabbix及安装agent
  6. 嘉年华回顾丨 王津银带你深入解析自动化运维能力框架
  7. 阻滞增长模型求解_种群增长模型
  8. Swagger注解-@ApiImplicitParams 和 @ApiImplicitParam
  9. Failed to compile../public/UEditor/dialogs/template/template.html 1:0Module parse failed: Unexpec
  10. Python高级用法:索引和切片
  11. 计算机word表格怎么求和,如何在Word中插入Excel自动汇总a求和表格,上班族必备技巧...
  12. iOS appIcon生成和设置
  13. 无人驾驶学习(二):定位与导航
  14. [附源码]Nodejs计算机毕业设计面向老年群体的健康养生系统Express(程序+LW)
  15. 将Iphone 8P手机中的照片导入电脑时出错
  16. SpringCache-redis缓存学习记录
  17. java开发程序员培训班,成功跳槽阿里!
  18. Alibaba Cloud 3 (Soaring Falcon) x86_64(Py3.7.8) 系统 YUM源
  19. 母亲节板报图片计算机方案,母亲节电子手抄报图片素材
  20. C# CultureInfo列表详细说明

热门文章

  1. [DB]MYSQL外键(Foreign Key)的使用(转载)
  2. 起面的英怯——幸运的舆图
  3. office2010的安装和卸载
  4. DedeCms进行SEO优化全攻略
  5. mysql导出数据库方法_mysql导出数据库几种方法
  6. epoll监听文件_linux网络编程之epoll源码重要部分详解
  7. python查看系统信息_Python脚本获取操作系统版本信息
  8. php兼容net的md5,解决c# md5与php md5加密不一致的问题(md5(unicode))
  9. 最保值电子产品绝对是它:后悔没多收几台
  10. 美政府停摆或考验机场安检 携枪旅客曾无障碍登机