Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


序列值

📄字数 3.8K
👁️阅读量 加载中...

序列值主要用于产生整数序列值,其产生整数值按照用户指定规则进行递增或递减。创建完成后也可以使用函数 nextval、currval 对序列值进行操作。

一、创建序列值

1.1 语法格式

1.2 参数说明

  • IF NOT EXISTS:创建序列值时若同名序列值存在则忽略错误,不会影响已存在序列值。
  • schema_name:模式名,默认为当前模式。
  • seq_name: 序列值名称,名称必须满足数据库对象命名规则中列出的要求。
  • SequenceOption:可选的序列值表达式,用来指定序列值的最小值、最大值、起始值、增长步长、缓存数量等选项。
  • COMMENT comment_str:可选的序列值注释信息。
  • START WITH var_valuevar_value为序列的初始值。如果序列递增,未指定初始值,则初始值为最小值;如果序列递减,未指定初始值,则初始值为最大值。
  • [CACHE var_value | NOCACHE]
    • CACHE | NOCACHE:是否在缓存中。
    • value是缓存序列值个数,代表要预分配并存储在内存中的序列号数量,以便更快地访问,最小值为1(一次只能生成一个值,即无缓存),同时也是默认值。
    • 若系统重启,未使用的缓存序列值将丢失,序列值起始值将变为cache后的下一个值。
    • 集群环境下,多节点使用同一个序列值,并且设置cache大于1,那么节点与节点之间使用序列值不连续,如cache设置为10,当前工作节点1使用序列号(1-10),若此时在工作节点2使用序列值则序列号为(11-20),节点2序列值的起始值为节点1的cache后的下一个值,其他工作节点使用起始值依此类推。
  • [CYCLE | NOCYCLE]:序列值达到最大值后是否循环。如果不循环,达到最大值后,继续产生新值会发生错误;默认不循环。
  • INCREMENT BY var_valuevar_value为序列步长(序列增加的幅度),默认为1。如果是负则按此步长递减。
  • [MAXVALUE var_value | NOMAXVALUE ]:指定序列可以生成的最大值。NOMAXVALUE是默认选项,对于递增序列,NOMAXVALUE意味着最大值是9223372036854775807,对于递减序列,最大值是-1。
  • [MINVALUE var_value | NOMINVALUE ]:指定序列可以生成的最小值。NOMINVALUE是默认选项,对于递增序列,NOMINVALUE意味着最小值是1,对于递减序列,最小值是-9223372036854775808。

提示

在高并发情况下,可以设置cache数量,减少数据库内部的磁盘交互,从而达到快速获取的目的。
在集群模式下,若需要各个工作节点的序列值连续同步,需将cache设置为1。
序列值的相关权限具体请参考 权限管理

1.3 示例

  • 示例1

    创建一个名为seq_1的序列值,该序列值最小值为1,最大值为1000,起始值为100,步长为1。

    sql
    
    SQL> CREATE SEQUENCE seq_1 MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1;
  • 示例2

    创建一个与原序列值名称相同但最大值属性不同的序列值,不会影响原序列值,会存在警告。

    sql
    
    -- 创建seq_2
    SQL> CREATE SEQUENCE IF NOT EXISTS seq_2 MAXVALUE 1000;
    
    -- 创建同名seq_2
    SQL> CREATE SEQUENCE IF NOT EXISTS seq_2 MAXVALUE 500;
    Warning: [E9005] 同名对象SEQ_2已存在
    
    -- 查询seq_2,不会影响seq_2属性
    SQL> SELECT ds.seq_name,ds.max_val FROM dba_sequences ds WHERE ds.seq_name='SEQ_2';
    +----------+---------+
    | SEQ_NAME | MAX_VAL |
    +----------+---------+
    | SEQ_2    | 1000    |
    +----------+---------+

二、修改序列值

2.1 语法格式

序列值修改语法中的各参数含义与创建序列值一致,可以对序列值的最小值、最大值、起始值、增长步长、缓存数量进行修改。

2.2 参数说明

2.3 示例

  • 示例

    创建序列值后,对最小值、最大值、增长步长、缓存数量、是否循环属性进行修改。

    sql
    
    -- 创建序列值
    SQL> CREATE SEQUENCE seq_test MINVALUE 1 MAXVALUE 1000 START WITH 100 CACHE 10 INCREMENT BY 1;
    
    SQL> SELECT seq_name, min_val,max_val,step_val,is_cycle,cache_val FROM dba_sequences ds WHERE ds.seq_name='seq_test';
    +----------+---------+---------+----------+----------+-----------+
    | SEQ_NAME | MIN_VAL | MAX_VAL | STEP_VAL | IS_CYCLE | CACHE_VAL |
    +----------+---------+---------+----------+----------+-----------+
    | SEQ_TEST | 1       | 1000    | 1        | F        | 10        |
    +----------+---------+---------+----------+----------+-----------+
    
    -- 修改序列值最小值、最大值、增长步长、缓存数量、是否循环。
    SQL> ALTER SEQUENCE seq_test MINVALUE 5 MAXVALUE 500 INCREMENT BY 5 CACHE 20 CYCLE;
    
    SQL> SELECT seq_name, min_val,max_val,step_val,is_cycle,cache_val FROM dba_sequences ds WHERE ds.seq_name='seq_test';
    +----------+---------+---------+----------+----------+-----------+
    | SEQ_NAME | MIN_VAL | MAX_VAL | STEP_VAL | IS_CYCLE | CACHE_VAL |
    +----------+---------+---------+----------+----------+-----------+
    | SEQ_TEST | 5       | 500     | 5        | T        | 20        |
    +----------+---------+---------+----------+----------+-----------+

三、使用序列值

3.1 NEXTVAL

将序列值前进到其下一个值并返回该值,创建序列值后,连续调用NEXTVAL可以获取从起始值开始连续的值。

  • 示例

    创建序列值后,使用NEXTVAL。

    sql
    
    -- 创建序列值
    SQL> CREATE SEQUENCE seq_test2 MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1;
    
    -- 获取序列的下一个值
    SQL> SELECT seq_test2.NEXTVAL FROM DUAL;
    +-------+
    | EXPR1 |
    +-------+
    | 100   |
    +-------+

3.2 CURRVAL

获取序列的当前值,CURRVAL返回的是当前会话中最近一次通过NEXTVAL获取的序列值。如果在调用NEXTVAL之前尝试使用CURRVAL则会报错,因为此时NEXTVAL未获取序列值,导致CURRVAL没有可以访问的序列值。

  • 示例

    sql
    
    -- 创建序列值
    SQL> CREATE SEQUENCE seq_test3 MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1;
    
    -- 第一次尝试使用CURRVAL
    SQL> SELECT CURRVAL('seq_test3') FROM DUAL;
    Error: [E7019 L1 C8] 当前会话中序列值seq_test3.CURRVAL不可用
    
    -- 调用NEXTVAL
    SQL> SELECT seq_test3.NEXTVAL FROM DUAL;
    +-------+
    | EXPR1 |
    +-------+
    | 100   |
    +-------+
    
    -- 再次尝试使用CURRVAL
    SQL> SELECT CURRVAL('seq_test3') FROM DUAL;
    +-------+
    | EXPR1 |
    +-------+
    | 100   |
    +-------+

注意

  • CURRVAL的生命周期:仅存在于会话中,且每个会话之间独立。

四、删除序列值

4.1 语法格式

4.2 参数说明

  • IF EXISTS:删除序列值时序列值不存在则忽略此错误。
  • schema_name:模式名,默认为当前模式。
  • seq_name: 序列值名称,名称必须满足数据库对象命名规则中列出的要求,。
  • CASCADE | RESTRICT:存在依赖序列值的对象时,是否强制删除序列值,CASCADE为强制删除(序列值为字段默认值时,不允许强制删除),默认为RESTRICT删除时报错。

4.3 示例

  • 示例

    删除序列值,序列值为表的默认字段。

    sql
    
    -- 先创建一个序列值
    SQL> CREATE SEQUENCE seq_test4  MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1;
    
    -- 创建表,序列值作为字段默认值
    SQL> CREATE TABLE tab_1 (col_1 int DEFAULT seq_test4.NEXTVAL);
    
    -- RESTRICT删除
    SQL> DROP SEQUENCE seq_test4;
    Error: [E7008] 存在对序列值SEQ_TEST4依赖的对象
    
    -- CASCADE删除(序列值为字段默认值不允许删除)
    SQL> DROP SEQUENCE seq_test4 CASCADE;
    Error: [E7008] 存在对序列值SEQ_TEST4依赖的对象
    
    -- 更改表的默认值
    SQL> ALTER TABLE tab_1 ALTER COLUMN col_1 DEFAULT 1;
    
    -- 删除序列值成功
    SQL> DROP SEQUENCE seq_test4;