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_SEQUENCE
  START WITH 1
  INCREMENT BY 1
  MAXVALUE 999999999999999999999999
  NOCACHE
  NOCYCLE;

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_SEQUENCE
  START WITH 1
  INCREMENT BY 10
  MAXVALUE 999999999999999999999999
  NOCACHE
  NOCYCLE;

五、使用序列

一旦创建了序列,就可以使用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来简化数据库操作和管理。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值