---
title: "管理序列 | OceanBase 文档中心"
description: 管理序列 本节主要介绍如何创建、修改和删除 MySQL 模式中的序列。 在 OceanBase 数据库中，序列（Sequence）是数据库按照一定规则生成的自增数字序列号，通常是一组间隔的数值（为数字类型）。由于序列具有自增的特性，故通常会被用作主键和唯一键。 序列可以提供两个伪列 CURRVAL 和 NEXTVAL…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# 管理序列

更新时间：2023-08-01 16:35:52

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

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

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

使用序列时，必须在 `CURRVAL` 和 `NEXTVAL` 前带上序列的名称，并用句点（.）引用。

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

## 创建序列

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

```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`：用于指定序列的最小值，取值范围为 -10^27^ ~ (10^27^-1)。

  如果指定为 `NOMINVALUE`，则升序时最小值为 1，降序时最小值为 -(10^27^-1)。

  如果不指定`MINVALUE`，则缺省为 `NOMINVALUE`。
 - `MAXVALUE int_value | NOMAXVALUE`：用于指定序列的最大值，取值范围为 (-10^27^+1) ~ (10^28^-1)。

  如果指定为 `NOMAXVALUE`，则升序时最大值为 (10^28^-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` 的示例如下：

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

```

更多 `CREATE SEQUENCE` 语句的信息，请参见 [CREATE SEQUENCE](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000356928)。

## 使用序列

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

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

- 顶层 `SELECT` 语句的选择列表中。
 - `INSERT` 语句中的 `VALUE` 子句中。
 - `UPDATE` 语句中的 `SET` 子句中。

例如：

```sql
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 语法如下：

```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` 的最大值，并指定自增值循环生成。

   ```sql
   obclient> ALTER SEQUENCE seq2 MAXVALUE 1024 CYCLE;

   ```
 2. 修改序列的起始值。

      - 如果 `INCREMENT BY` 的值大于 `0`，则可以重置序列后，让其取值从 `MINVALUE` 开始；如果 `INCREMENT BY` 的值小于 `0`，则可以重置序列后，让其取值从 `MAXVALUE` 开始，语句如下：

       ```sql
       obclient> ALTER SEQUENCE seq3 RESTART;
       Query OK, 0 rows affected

       ```
      - 重置序列，并让其取值从 `3` 开始，语句如下：

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

       ```

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

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

   ```

更多 `ALTER SEQUENCE` 语句的信息，请参见 [ALTER SEQUENCE](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000356918)。

## 删除序列

您可以使用 `DROP SEQUENCE` 语句来删除序列，SQL 语法如下：

```sql
DROP SEQUENCE [database_name.]sequence_name;

```

语句使用说明：

- 执行该语句的用户需要具备 `DROP` 权限。
 - `database_name.` 用于指定序列所在的数据库。如果不指定 `database_name.` ，则默认为当前登录数据库的序列。

示例：删除序列 `S1`。

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

```

更多 `DROP SEQUENCE` 语句的信息，请参见 [DROP SEQUENCE](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000356942)。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
