一、自增列

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

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

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

二、在Oracle11中设置自增字段

Oracle里的序列(SEQUENCE),可间接实现自增主键的作用。

序列(Sequence),又叫序列生成器,用于提供一系列的数字,开发人员使用序列生成唯一键。每次访问序列,序列按照一定的规律增加或者减少。

序列的定义存储在SYSTEM表空间中,序列不像表,它不会占用磁盘空间。

序列独立于事务,每次事务的提交和回滚都不会影响序列。

1.创建序列CREATE SEQUENCE TEST_ID_SEQ

INCREMENT BY 1

START WITH 1

MINVALUE 1

MAXVALUE 999999999

NOCYCLE

NOCACHE

ORDER;

SEQUENCE说明:

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

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

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

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

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

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

ORDER or NOORDER : 设置是否按照请求的顺序产生序列

如果需要删除序列,可以使用下面的命令:DROP SEQUENCE TEST_ID_SEQ;

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

先创建测试表:CREATE TABLE "TEST" (

ID NUMBER(11) PRIMARY KEY,

NAME VARCHAR2(50BYTE) NOT NULL

);

插入数据: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

100 name1

101 name2

102 name3

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

## 2.创建触发器

```oraclesqlplus

CREATE OR REPLACE TRIGGER TEST_ID_SEQ

BEFORE INSERT ON "TEST"

FOR EACH ROW

BEGIN

SELECT TEST_ID_SEQ.NEXTVAL

INTO :NEW."ID"

FROM DUAL;

END;

插入数据:

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

--- ------

100 name1

101 name2

102 name3

103 name4

104 name5

105 name6

3.在MyBatis中运用

select TEST_ID_SEQ.NEXTVAL as id from dual

insert "TEST"

ID,

NAME

values

#{ID, jdbcType=BIGINT},

#{NAME, jdbcType=VARCHAR}

4.性能

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

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

三、在Oracle12c中设置自增字段

在 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中实现ID自增相关推荐

  1. Oracle/Kingbase中用序列和触发器实现ID自增

    在设计数据库的时候,Oracle中没有类似SQL Server中系统自动分配ID作为主键的功能,这时Oracle可以通过"序列"和"触发器"来实现ID自动增加的 ...

  2. python中构造方法 id自增_Python+MongoDB自增键值的简单实现

    背景 最近在写一个测试工具箱,里面有一个bug记录系统,因为后台我是用Django和MongoDB来实现的,就遇到了一个问题,要如何实现一个自增的字段. 传统的关系型数据库要实现起来是非常容易,只要直 ...

  3. 设置mysql字段不能自增_MySQL中不能创建自增字段的解决方法

    原因分析: 引起MySQL不能创建自动增加的字段的原因是在MySQL5.0.2版本中的The Server SQL Mode 中新加了几种 sql_mode,并且在sql的my.ini文件中的sql- ...

  4. ssh oracle id native,hibernate解决oracle的id自增?

    以前做SSH项目时,涉及到的数据库是mySQL,只需将bean的配置文件id设为native 就可以实现表id的自增. 现在用到了Oracle,当然知道这样是不行的啦,那么用序列自增? 我在网络上搜索 ...

  5. 问题:oracle id自增 insert语句如何写?

    情况如下,oracle数据库,假设现在从user表查询数据有三条 ID userName 0 小明 1 小红 2 小张 此时想在PLSQL写insert语句插入一条新数据,ID为主键,肯定不能这么写: ...

  6. ORACLE利用序列实现ID自增

    1.仅使用序列产生自增主键 序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象.序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动 ...

  7. 【oracle】oracle创建表、创建索引、创建自增id

    说实话oracle实在用不习惯,虽然已经使用近两年了. 可能是习惯问题吧!毕竟mysql和mssql使用的更频繁 1.oracle创建表 创建表还是比较简单的 -- oracle 创建数据库表 CRE ...

  8. ORACLE 实现 ID 自增

    前言 目录 前言 具体命令 具体详解: 由于oracle数据库不像mysql一样在建立表的时候设置自动增长列功能 设置UUID的缺点 字符串占用的空间比较大. 而且效率也比较低下. 生成的ID是字符串 ...

  9. oracle批量创建序列号,Oracle数据库中创建并利用序列号生成ID

    已经有了序列后,怎么样自动生成ID? 其实是用一条包含序列号的sql语句从dual表中查出的id再赋值给id 以下举两条实战的sql: select '00010222' ||  lpad(seq_s ...

最新文章

  1. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...
  2. Vsftpd服务的部署及优化
  3. python科学计算与图形渲染_宁哥Python科学计算与图形渲染库课程
  4. 95-50-060-java.nio.channels-NIO-NIO之Selector(选择器)
  5. django 环境配置.
  6. 求解偏微分方程开源有限元软件deal.II学习--Step 13
  7. sony笔记本触摸板角落轻敲功能
  8. Java8新特性系列(序)
  9. oracle10g sql on条件,ORACLE 10G使用SQLNET.ORA限制IP登陆
  10. 荒野行动 android 鼠标,荒野行动键盘映射模拟器
  11. 阿特拉斯拧紧枪说明书_阿特拉斯使用说明书(全).pdf
  12. CCF201903-2 二十四点游戏(JAVA版)
  13. 图解计算机基础网站上线了
  14. Word-embedding的资料整理
  15. vue渐进式框架的理解
  16. zabbix 5.0中自定义监控单个IP的最大流量
  17. 将字符串“123”转换为十六进制0x123或者十进制123
  18. derek程序员英文名_访谈-Derek Powazek谈社区设计
  19. 开发app需要什么技术?手机app制作方式、价格及性能盘点
  20. android 手机桌面,安卓手机桌面介绍:教你认识安卓手机桌面

热门文章

  1. python re —— 自然语言处理与正则表达式
  2. sklearn preprocessing 数据预处理(OneHotEncoder)
  3. 使用 install.packages() 安装所需的包
  4. 矩阵分解——三角分解(Cholesky 分解)
  5. 面向对象——面向客户端编程
  6. 整型索引查询mysql是不是快点_图解Mysql索引的数据结构!看不懂你来找我
  7. python软件-python 2.7官方版
  8. python和c先学哪个-先学C语言还是Python?资深程序员往往是这样建议的!
  9. 想自学python看哪位的视频比较好-python自学视频看这个就对了
  10. python自学行吗-python能够自学吗