Oracle数据库如何实现自增-序列Sequence介绍(适合小白)

news/2024/10/31 0:19:31/

        Oracle数据库中的Sequence是一种特殊的数据库对象,可以生成一组等间隔的数值,常用于为表中的行自动生成序列号。也常用于主键自增的情况。

下面我将以小白的视角带大家介绍下Oracle数据库序列Sequence:

一、创建简单序列

创建简单序列语法:

        create sequence序列名称

注意:我们在刚建立序列后,无法提取当前值,只有先提取下一个值时才能再次提取当前值。


提取下一个值:  NEXTVAL返回序列的下一个值

        select  序列名称.nextval  from dual

提取当前值:  CURRVAL返回序列的当前值

        select 序列名称.currval  from  dual

DUAN表介绍:

        DUAL表就是Oracle与数据字典自动创建的一张表,这张表是一个单行单列的表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),DUAL表中只有一个数据'X',Oracle有内部逻辑保证DUAL表中永远只有一条数据。DUAL表主要是用来选择系统变量或是求一个表达式的值。

二、创建复杂序列

创建复杂序列语法:

CREATE SEQUENCE sequence_name

        [INCREMENT BY n]  //递增的序列值是n如果n是正数就递增,如果是负数就递减 默认是1

        [START WITH n]   // 开始的值,递增默认是minvalue 递减是maxvalue

        [MAXVALUE n | NOMAXVALUE]   //最大值

        [MINVALUE n | NOMINVALUE]   //最小值

        [CYCLE | NOCYCLE]   // 循环/不循环

        [CACHE n | NOCACHE];    //分配并存入到内存中

  • sequence_name: 序列的名称。
  • INCREMENT BY n: 序列每次递增的步长(默认为1)。
  • START WITH n: 序列的起始值(默认为1)。
  • MAXVALUE n: 序列的最大值。
  • NOMAXVALUE: 指定没有最大值限制。
  • MINVALUE n: 序列的最小值。
  • NOMINVALUE: 指定没有最小值限制。
  • CYCLE: 当达到最大值或最小值时,序列将循环(重新开始)。
  • NOCYCLE: 当达到最大值或最小值时,序列将停止递增。
  • CACHE n: 在内存中缓存n个序列值,以提高性能(默认为20)。
  • NOCACHE: 不在内存中缓存序列值。

三、创建序列,使用主键自增案例

3.1  创建序列

创建一个序列名为USER_SEQUENCE,开始值为1,每次递增1,最大值为999999999999999999999999,不循环,不缓存的序列。

CREATE SEQUENCE USER_SEQUENCESTART WITH 1INCREMENT BY 1MAXVALUE 999999999999999999999999NOCACHENOCYCLE;

3.2  应用Sequence

Sequence生成的唯一值可以在INSERT语句中使用。例如:

INSERT INTO table_name (id, name)
VALUES (USER_SEQUENCE.NEXTVAL, 'John Doe');

 使用sequence_name.NEXTVAL可以获取下一个Sequence值。这样就可以实现主键自增啦。

 

  • 第一次使用seqName.NEXTVAL返回的是序列的起始值;随后的seqName.NEXTVAL会自动增加你定义的INCREMENT BY的值,然后返回增加后的值作为序列值。
  • seqName.NEXTVAL初始化之后才能使用seqName.CURRVAL

 

3.3  查看Sequence信息

SELECT USER_SEQUENCE.CURRVAL
FROM dual;

通过sequence_name.CURRVAL可以查看当前Sequence的值。

四、修改序列

类似创建序列,不过需要注意的是,不支持修改序列起始值。

示例:

CREATE SEQUENCE USER_SEQUENCESTART WITH 1INCREMENT BY 10MAXVALUE 999999999999999999999999NOCACHENOCYCLE;

五、使用序列

一旦创建了序列,就可以使用seqName.CURRVALseqName.NEXTVAL来分别获取序列的当前值和下一个序列值。

可以使用序列的地方:

  • INSERT的VALUES子句、子查询
  • 不包含子查询、snapshot、视图的 SELECT 语句中的列表
  • UPDATE中的SET子句

不可以使用序列的地方:

  • 子查询、视图和实体化视图的查询

  • 带DISTINCT的SELECT语句

  • 带 GROUP BY和ORDER BY的SELECT语句

  • 带UNION或INTERSECT或MINUS的SELECT语句

  • SELECT中的WHERE字句

  • CREATE TABLE与ALTER TABLE中的default值、check约束条件。

示例:

INSERT INTO MY_ORDER('ID', 'SEQ', 'ORDER_NO') VALUES(1, orders_seq.NEXTVAL, 'xdfkgdls20220821');

SELECT orders_seq.CURRVAL FROM DUAL;

注意:

  • 第一次使用seqName.NEXTVAL返回的是序列的起始值;随后的seqName.NEXTVAL会自动增加你定义的INCREMENT BY的值,然后返回增加后的值作为序列值。
  • seqName.NEXTVAL初始化之后才能使用seqName.CURRVAL

六、删除序列

DROP SEQUENCE seqName;

七、总结

Oracle数据库中的Sequence是一种特殊的数据库对象,可以生成一组等间隔的数值,常用于为表中的行自动生成序列号。Sequence和视图一样,并不占用实际的存储空间,只是在数据字典中保存它的定义信息。

Sequence的定义语法如下:

CREATE SEQUENCE [user.]sequence_name [increment by n] [start with n] [maxvalue n | nomaxvalue] [minvalue n | nominvalue];

Sequence的主要用途是生成表的主键值,也可以在插入语句中引用,或通过查询检查当前值,或使序列增至下一个值。

Oracle数据库中的Sequence是一种非常有用的数据库对象,它可以帮助生成一组等间隔的数值,并且常常被用于为表中的行自动生成序列号。以下是关于Oracle数据库序列的详细总结:

  1. 定义和使用:

    • Sequence的定义是通过CREATE SEQUENCE语句完成的。在定义时,需要指定一个唯一的名称(sequence_name)以及一些可选的参数。
    • INCREMENT BY指定了序列的增量值。默认情况下,序列会每次增加1。
    • START WITH指定了序列的起始值。默认情况下,序列会从最小的可能值开始。
    • MAXVALUEMINVALUE分别指定了序列的最大值和最小值。如果未指定,则最大值和最小值会根据序列的增量和当前值自动计算。
  2. 主要用途:

    • 生成主键值:由于Sequence可以生成唯一的数值序列,因此常常被用于生成表的主键值。通过将Sequence与表的主键列关联,可以确保每个行都有一个唯一的主键值。
    • 插入语句引用:在插入数据时,可以使用Sequence的当前值作为表中的某些列的值。这样可以避免手动指定值,并确保数据的顺序性。
    • 查询当前值:通过查询Sequence的当前值,可以了解下一个将被生成的值。这有助于在需要时进行适当的操作,例如在插入数据之前获取主键值。
  3. 内置函数:

    • Sequence还提供了一些内置函数,可以用于查询和控制Sequence的行为。例如,NEXTVAL函数用于获取下一个序列值,CURRVAL函数用于获取当前序列值,NEXT NUMBERS函数用于获取指定数量的连续序列值。
  4. 注意事项:

    • Sequence是数据库对象,因此不占用实际的存储空间。它们只是在数据字典中保存定义信息。
    • Sequence可以由多个用户并发使用,但每个用户只能获取一次Sequence的下一个值。如果需要确保并发访问时的唯一性,可以使用数据库锁或其他机制来控制并发访问。
    • Sequence的最大值和最小值是可选的,但如果指定了最大值或最小值,则它们应该足够大或小以容纳所有可能的序列值。否则,如果超过了最大值或最小值,Sequence将停止生成新的值。
  5. 总结:

        Oracle数据库中的Sequence是一种非常方便且实用的数据库对象,它可以生成一组等间隔的数值序列,常被用于为表中的行自动生成主键值等唯一标识符。通过了解Sequence的定义、使用、主要用途、内置函数以及注意事项,开发人员可以更好地利用Sequence来简化数据库操作和管理。


http://www.ppmy.cn/news/1262729.html

相关文章

融合科技,升级医疗体验——医院陪诊服务的技术创新

随着科技的迅猛发展,医疗服务领域也在积极借助技术手段提升患者体验。本文将探讨如何利用先进的技术代码,将医院陪诊服务推向新的高度。 1. 医疗预约系统的实现 # 通过Python代码实现医疗预约系统 class MedicalAppointment:def __init__(self, patie…

EVT_WDF_DEVICE_PREPARE_HARDWARE API

NTSTATUS EVT_WDF_DEVICE_PREPARE_HARDWARE(__inWDFDEVICE Device,__inWDFCMRESLIST ResourcesRaw,__inWDFCMRESLIST ResourcesTranslated); 上面API中ResourcesRaw和ResourcesTranslated类型相同,那他们的区别是啥? 答: EVT_WDF_DEVICE_P…

交付《啤酒游戏经营决策沙盘》的项目

感谢首富客户连续两年的邀请,交付《啤酒游戏经营决策沙盘》的项目,下周一JSTO首席学习官Luna想让我分享下系统思考与投资理财,想到曾经看过的一本书《深度思维》,看到一些结构来预判未来。不仅仅可以应用在企业经营和组织发展上&a…

nodejs微信小程序+python+PHP的游戏测评网站设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

blender 粒子系统 roughness 属性

粒子系统中的Roughness是一种用来控制粒子的随机性和不规则性的属性,它可以影响粒子的发射方向、速度、大小、旋转等。Roughness有以下几个子属性: - **Uniform**:这个属性用来控制粒子的发射方向的随机性,即粒子在法线方向上的偏…

前端知识笔记(三十七)———Django与Ajax

特点: 异步提交 局部刷新 例子:github注册 动态获取用户名实时的跟后端确认并实时的展示到前端(局部刷新) 朝后端发送请求的方式 1.浏览器地址栏直接输入url回车 -----》get请求 2.a标签的href属性 -----》get请求 3…

考研真题数据结构

【2018年山西大学真题】试编写一个算法,使之能在数组L【1~n】中找到最小元素。 (1)给出算法的基本思想。 (2)根据设计思想,给出描述算法。 (3)分析所给算法的时间复杂…

Spring Cloud切换内嵌Tomcat为宝兰德Application Server

目录 替换Tomcat中间件Tomcat是什么Spring Cloud剔除tomcat引入宝兰德Application Server打包运行授权导入 替换Tomcat中间件 Tomcat是什么 Spring Cloud剔除tomcat <!--集成springmvc框架 --><dependency><groupId>org.springframework.boot</groupId&…