当前位置: 首页 > news >正文

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

        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.lryc.cn/news/255603.html

相关文章:

  • ke14--10章-2JDBC例子
  • 04数据平台Flume
  • Redis--13--缓存一致性问题
  • 12.7作业
  • ssl什么是公钥和私钥?
  • github首次将文件合到远端分支,发现名字不是master,而是main
  • RTX 40 系彻底摆烂,NVIDIA 让三年老卡焕发第二春
  • ELK技术栈介绍及简单使用实例
  • 基于Java健身房课程管理系统
  • DAPP开发【02】Remix使用
  • 大华DSS S2-045 OGNL表达式注入漏洞复现
  • 大数据之HBase(二)
  • 前后端数据传输格式(下)
  • mysql pxc高可用离线部署(三)
  • XXL-JOB 日志表和日志文件自动清理
  • 常用sql记录
  • 设备温度和振动综合监测:温振一体式传感器的优点和应用
  • 彻底解决ModuleNotFoundError: No module named ‘exceptions‘【Bug完美解决】
  • yarn和npm的区别
  • 设计图中时序图
  • 反射实现tomcat
  • Ubuntu 安装 CUDA 和 cuDNN 详细步骤
  • ArkTS快速入门
  • HTTP不同场景下的通信过程和用户上网认证过程分析
  • VR 实现 Splash Screen 效果
  • HarmonyOS学习--TypeScript语言学习(一)
  • 【C语言】函数递归详解(一)
  • WT588F02B-8S语音芯片助力破壁机:智能声音播放提示IC引领健康生活新潮流
  • NXP iMX8M Plus Qt5 双屏显示
  • RepidJson中Writer类、FilewriteStream类、 PrettyWriter类的区别