[原创]Oracle自增序列

自增序列简单介绍

自增列是数据库中值随插入的每个行自动增加的一列。常用于主键或 ID 字段,这样每次增加一行时,不用指该字段的值,它就会自动增加,而且是唯一的。减少了每次insert时候需要人工维护追加这一列。

自增序列的实现

Oracle 11g 测试如下

SQL> create table tab001( id number(10) primary key not null, text varchar2(100byte) not null);

Table created.

SQL>

SQL> create sequence tab0_seq increment by 1 start with 10 maxvalue 99999999 nocycle nocache;

Sequence created.

SQL>

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

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

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

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

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

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

注意点:

第一次 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 防止这种情况。

SQL> insert into tab001(id,text) values (tab0_seq.nextval,'test0000000001');

1 row created.

SQL> insert into tab001(id,text) values (tab0_seq.nextval,'test0000000002');

1 row created.

SQL>

SQL> col text for a30

SQL> select * from tab001;

ID TEXT

---------- ------------------------------

10 test0000000001

11 test0000000002

SQL>

如上方式是否比较麻烦,需要每次指定tab0_seq.nextval? 是否Oracle本身可以帮我们管理?

11g是通过触发器来实现。

SQL>CREATE OR REPLACE TRIGGER TAB001_ID_SEQ_TRG

BEFORE INSERT ON "TAB001"

FOR EACH ROW

WHEN (NEW."ID" IS NULL)

BEGIN

SELECT TAB0_SEQ.NEXTVAL

INTO :NEW."ID"

FROM DUAL;

END;

/

Trigger created.

SQL>

SQL> insert into tab001(text) values('test0000000003_trg');

1 row created.

SQL> select * from tab001;

ID TEXT

---------- ------------------------------

10 test0000000001

11 test0000000002

12 test0000000003_trg

SQL>

SQL> insert into tab001(id, text) values(null,'test0000000003_trg');

1 row created.

SQL> select * from tab001;

ID TEXT

---------- ------------------------------

10 test0000000001

11 test0000000002

12 test0000000003_trg

13 test0000000003_trg

SQL>

备注:

上面两种写法都可,id为null或者不用指定id进行values插入数据

但是又显示指定id,如下:

SQL> insert into tab001(id, text) values(100,'test0000000003_trg');

1 row created.

SQL> select * from tab001;

ID TEXT

---------- ------------------------------

10 test0000000001

11 test0000000002

12 test0000000003_trg

13 test0000000003_trg

100 test0000000003_trg

SQL> insert into tab001(id, text) values(null,'test0000000004_trg_1');

1 row created.

SQL> select * from tab001;

ID TEXT

---------- ------------------------------

10 test0000000001

11 test0000000002

12 test0000000003_trg

13 test0000000003_trg

100 test0000000003_trg

14 test0000000004_trg_1

6 rows selected.

SQL>

可以知道,插入100之后下一条触发器生成的序列式14,不是101,这个时候需要注意,如果id设置为主键不能重复的,如果达到序列到达到100之后会报错,这个时候需要规范insert的方式,通过触发器管理sequence,insert时候不能显示的去插入数据。否则如下报错:

~省略~

98 test0000000004_trg_1

99 test0000000004_trg_1

91 rows selected.

SQL> insert into tab001(id, text) values(null,'test0000000004_trg_1');

insert into tab001(id, text) values(null,'test0000000004_trg_1')

*

ERROR at line 1:

ORA-00001: unique constraint (LIN.SYS_C0017505) violated

SQL>

对触发器实现的反思:

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

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

Oracle 12c的实现

在 Oracle 12c 设置自增字段就简单,通过使用 Oracle 12c 提供了 IDENTITY 属性:

CREATE TABLE "TEST001_12c" (

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

TEXT VARCHAR2(20BYTE) NOT NULL

);

12c的实现越来越方便。

参考资料

Oracle 11g 语法参考: CREATE SEQUENCE

++++++++++++++++ EOF LinHong ++++++++++++++++

oracle自增序列带字母,[原创]Oracle自增序列相关推荐

  1. oracle对同义词的解释,[原创]oracle同义词解释

    7.8 同义词 同义词是对象的备选名称,如果对象存在同义词,那么任何sql语句都能通过实际名称或通过同义词来访问该对象.同义词看上去似乎没什么作用,然而实际情况并非如此.使用同义词意味着应用程序可以对 ...

  2. oracle经常考的题型是哪些,Oracle考试试题(带答案).doc

    Oracle考试试题(带答案) 选择(每题3分) 1)当Oracle服务器启动时,下列哪种文件不是必须的().a)数据文件b)控制文件c)日志文件d)归档日志文件参考答案D 2)在Oracle中,当用 ...

  3. 如何安装Oracle数据库自带的HR Sample Schema

    本文参考了此文档. 如果希望使用Github安装较全的Sample Schema,可参见如何使用github安装Oracle 数据库12c Sample Schema (示例Schema) 数据库安装 ...

  4. Oracle 12c 自带的SQL Developer新建连接出现的问题:Got minus one from a read call,connect lapse 60018 ms,....(已解决)

    Oracle 12c 自带的SQL Developer新建连接出现的问题:Got minus one from a read call,connect lapse 60018 ms,-(已解决) 以上 ...

  5. spring访问oracle函数,spring调用带参数的oracle函数应注意的问题

    spring可以方便的访问oracle的存储过程.函数. spring文档举了一个访问sysdate的例子,它不需要输入参数,使用如下: public class TestStoredProcedur ...

  6. oracle查询学生人数语句,Oracle期末复习题-带答案

    Oracle期末复习题 1.简单介绍一下Oracle数据库管理系统 2.举例说明Oracle与SQL Server的异同(至少说出2项以上) 3.简述Oracle数据库的体系结构 4.Oracle数据 ...

  7. oracle整库的移植,Oracle数据库整机移植技术(原创)

    Oracle数据库整机移植技术 本文源自一次做Oracle9i DataGuard测试而产生的思路.前些时间有网友提出因为OS损坏,在硬盘没有损坏的情况下可否将数据库恢复至另一台机器上.现在不管从理论 ...

  8. ogg oracle 测试kafka_基于OGG的Oracle与Hadoop集群/kafka准实时同步

    Oracle里存储的结构化数据导出到Hadoop体系做离线计算是一种常见数据处置手段.近期有场景需要做Oracle到Hadoop体系的实时导入,这里以此案例做以介绍. Oracle作为商业化的数据库解 ...

  9. oracle rdbms 占内存_027、Oracle数据库

    1.数据库相关概念 (1)什么是数据库 所谓的数据库其实就是数据的集合.用户可以对集合中的数据进行新增.查询.更新. 删除等操作.数据库是以一定方式储存在一起.能与多个用户共享.具有尽可能小的冗余度. ...

  10. Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技

    本文是钢哥的Oracle APEX系列文章中的第一篇,完整 Oracle APEX 系列文章如下:  - Oracle APEX 系列文章1:Oracle APEX, 让你秒变全栈开发的黑科技  - ...

最新文章

  1. C语言的HashTable简单实现
  2. springmvc 音频流输出_音频管理模块AudioDeviceModule解读
  3. 微型计算机 2018 5月,现在是2018年,我的电脑最近总是弹出说有重要更新,提示自2017年5月9日后,microsoft - Microsoft Community...
  4. 容器技术之快速了解K8S各抽象资源及组件架构
  5. Windows 10 之重新安装应用
  6. 同理qt也一样蜡笔小新
  7. Unicode 属性类
  8. SVM支持向量机习题解答
  9. string.Format 格式化输出
  10. oracle--Tracing PL/SQL subprogram calls with parameters values--Mahmoud Hatem,
  11. 收藏:40个Linux运维面试经典基础问题!
  12. WebService /php soap 相关调用 收藏
  13. Android 解决表情面板和软键盘切换时跳闪的问题
  14. 【机器人学】正运动学详解
  15. 中国行政区数据及三级联动菜单
  16. 【K70例程】003读取LM75A温度传感器(I2C)
  17. 北京市小汽车摇号程序的反编译、算法及存在的问题浅析
  18. abb机器人离线编程软件叫做_工业机器人离线编程(ABB)1-2 常用离线编程软件介绍.pptx...
  19. python开发html_Python开发——16.HTML
  20. 块存储、文件存储与对象存储的区别与应用场景

热门文章

  1. 资讯--2019年4月
  2. 如何自定义Mac锁屏界面消息?
  3. excel宏编程 c语言,宏(巨集)
  4. 吉他学习笔记--更新中
  5. DSP芯片的基本结构
  6. 二维码在线生成 扫描二维码打电话 扫码拨号
  7. CSS 实现元素固定宽高比
  8. elasticsearch使用中文分词器和拼音分词器,自定义分词器
  9. SAS数据集随机抽样方法
  10. iOS UI 自动化测试原理以及在 Trip.com 的应用实践