暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase 管理序列

原创 huayumicheng 2023-07-12
718
转载:https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001576899 

本节主要介绍如何创建、修改和删除 MySQL 模式中的序列。

在 OceanBase 数据库中,序列(Sequence)是数据库按照一定规则生成的自增数字序列号,通常是一组间隔的数值(为数字类型)。由于序列具有自增的特性,故通常会被用作主键和唯一键。

序列可以提供两个伪列 CURRVAL和 NEXTVAL,用于返回当前的序列值和下一个序列值。每当查询 NEXTVAL 都会推进 CURRVAL 值。

使用序列时,必须在 CURRVAL 和 NEXTVAL 前带上序列的名称,并用句点(.)引用。

例如,序列的名称为 SEQ_FOO,则可以通过 SEQ_FOO.CURRVAL 获取 SEQ_FOO 序列的当前值。同样,可以通过 SEQ_FOO.NEXTVAL 获取 SEQ_FOO 序列的下一个自增值。

创建序列

语法

您可以使用 CREATE SEQUENCE 语句来创建序列。SQL 语法如下:

CREATE SEQUENCE [database_name.]sequence_name
[MINVALUE int_value | NOMINVALUE]
[MAXVALUE int_value | NOMAXVALUE]
[START WITH int_value]
[INCREMENT BY int_value]
[CACHE int_value | NOCACHE]
[ORDER | NOORDER]
[CYCLE | NOCYCLE];

语句使用说明:

  • 执行该语句的用户需要具备 CREATE 权限。

  • database_name. :用于指定序列所在的数据库。如果不指定 database_name. ,则默认为创建当前登录数据库的序列。

  • MINVALUE int_value | NOMINVALUE:用于指定序列的最小值,取值范围为 [-1027 ~ (1027-1)]。

    如果指定为 NOMINVALUE,则升序时最小值为 1,降序时最小值为 -(1027-1)。

    如果不指定MINVALUE,则缺省为 NOMINVALUE

  • MAXVALUE int_value | NOMAXVALUE:用于指定序列的最大值,取值范围为 [(-1027+1) ~ (1028-1)]。

    如果指定为 NOMAXVALUE,则升序时最大值为 (1028-1),降序时最大值为 -1

    如果不指定 MAXVALUE,则缺省为 NOMAXVALUE

  • START WITH:用于指定序列的起始值。该值必须小于等于 MAXVALUE,且大于等于 MINVALUE。如果不指定,则升序时默认取值为最小值,降序时默认取值为最大值。

  • INCREMENT BY:用于指定序列的自增步数。该值不可以为 0。如果指定为正数,则序列为升序;如果指定为负数,则序列为降序。如果不指定,则缺省值为 1

  • CACHE:用于指定在内存中预分配的自增值个数,默认为 20

  • ORDER | NOORDER:用于指定序列的值是否按顺序生成。ORDER 表示按顺序生成,NOORDER 表示不按顺序生成。默认为 NOORDER

  • CYCLE | NOCYCLE:用于指定序列的值是否循环生成。CYCLE 表示循环生成,NOCYCLE 表示不循环生成。默认为 NOCYCLE

    注意

    • 如果同时指定 MINVALUE 和 MAXVALUE,则 MINVALUE 必须小于 MAXVALUE

    • MAXVALUE 和 MINVALUE 之差必须大于等于 INCREMENT BY int_value

    • CACHE 的值必须大于 1,如果 CACHE INT_VALUE 的值为 1,则等价于 NOCACHE

    • 指定了 CYCLE,且 INCREMENT BY 的值小于 0 时,必须指定 MINVALUE

    • 指定了 CYCLE 时,CACHE 的数量必须不能超过一个 CYCLE

示例

创建一个序列 seq1 并指定自增步数为 2

obclient> CREATE SEQUENCE seq1 START WITH 1 MINVALUE 1 MAXVALUE 10 INCREMENT BY 2 NOCYCLE NOORDER CACHE 30;

更多 CREATE SEQUENCE 语句的信息,请参见 CREATE SEQUENCE

使用序列

创建序列后,您可以引用序列。

序列的 CURRVAL 和 NEXTVAL 的值可以用于以下位置:

  • 顶层 SELECT 语句的选择列表中。

  • INSERT 语句中的 VALUE 子句中。

  • UPDATE 语句中的 SET 子句中。

例如:

obclient> SELECT SEQUENCE_NAME.NEXTVAL FROM DUAL;      /*每执行一次 Sequence 号就会增加*/

obclient> SELECT SEQUENCE_NAME.CURRVAL FROM DUAL;     /*执行多少次 Sequence 号都不会变化*/

第一次引用 NEXTVAL 将返回序列的初始值,后续对 NEXTVAL 的引用将按照上一次序列的返回值加上序列定义的步长后返回一个新值。任何时候对 CURRVAL 的引用,都将返回当前序列的值,即最后一次对 NEXTVAL 引用时返回的值。

在会话中引用序列的 CURRVAL 伪列前,都应首先应用序列的 NEXTVAL 伪列来初始化本次会话的序列值。

创建序列时,可以定义其初始值以及其值之间的增量。对 NEXTVAL 的第一次引用将返回序列的初始值。对 NEXTVAL 的后续引用将会使序列值按照定义的增量递增,并返回新值。任何对 CURRVAL 的引用总是返回该序列的当前值,即最后一次对 NEXTVAL 引用时返回的值。

修改序列

语法

序列创建成功后,您可以使用 ALTER SEQUENCE 语句来修改序列的属性。OceanBase 数据库支持修改序列的起始值、最小值、最大值、步长和循环属性。修改序列的 SQL 语法如下:

ALTER SEQUENCE [database_name.]sequence_name
{
[RESTART]
|[START WITH int_value]
|[MINVALUE int_value | NOMINVALUE]
|[MAXVALUE int_value | NOMAXVALUE]
|[INCREMENT BY int_value]
|[CACHE int_value | NOCACHE]
|[ORDER | NOORDER]
|[CYCLE | NOCYCLE]
};

执行该语句的用户需要具备 ALTER 权限。

示例

  1. 修改序列 seq2 的最大值,并指定自增值循环生成。

    obclient> ALTER SEQUENCE seq2 MAXVALUE 1024 CYCLE;
    
  2. 修改序列的起始值。

    • 如果 INCREMENT BY 的值大于 0,则可以重置序列后,让其取值从 MINVALUE 开始;如果 INCREMENT BY 的值小于 0,则可以重置序列后,让其取值从 MAXVALUE 开始,语句如下:

      obclient> ALTER SEQUENCE seq3 RESTART;
      Query OK, 0 rows affected
      
    • 重置序列,并让其取值从 3 开始,语句如下:

      obclient> ALTER SEQUENCE seq4 RESTART START WITH 3;
      Query OK, 0 rows affected
      

    修改序列的起始值时,RESTART 在语句中的位置并不一定要求在序列名后,它可以在语句中的任意位置,示例如下:

    obclient> ALTER SEQUENCE seq4 START WITH 3 RESTART MINVALUE -100 CYCLE;
    Query OK, 0 rows affected
    

更多 ALTER SEQUENCE 语句的信息,请参见 ALTER SEQUENCE

删除序列

语法

您可以使用 DROP SEQUENCE 语句来删除序列,SQL 语法如下:

DROP SEQUENCE [database_name.]sequence_name;

语句使用说明:

  • 执行该语句的用户需要具备 DROP 权限。

  • database_name. 用于指定序列所在的数据库。如果不指定 database_name. ,则默认为当前登录数据库的序列。

示例

删除序列 S1

obclient> DROP SEQUENCE S1;
Query OK, 0 rows affected


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论