You need to enable JavaScript to run this app.
导航
Sequence Engine for MySQL 5.7
最近更新时间:2025.02.26 17:32:03首次发布时间:2025.02.26 10:55:43

本文介绍云数据库 MySQL 版为 MySQL 5.7 实例中提供的 Sequence Engine。

背景信息

云数据库 MySQL 版为 MySQL 5.7 版本实例提供了 Sequence Engine,用于获取唯一递增序列值。Sequence Engine 是一个逻辑引擎,底层仍使用 InnoDB 存储引擎进行数据持久化,可以兼容现有的数据备份恢复工具。上层通过封装,实现了序列值生成、缓存等等功能。

前提条件

已创建 MySQL 5.7 版本实例且实例处于运行中状态。具体操作,请参见创建实例

创建 Sequence

通过 CREATE SEQUENCE 语句创建 Sequence。

CREATE SEQUENCE [IF NOT EXISTS] <数据库名>.<Sequence名称>
    [START WITH <constant>]
    [MINVALUE <constant>]
    [MAXVALUE <constant>]
    [INCREMENT BY <constant>]
    [CACHE <constant> | NOCACHE]
    [CYCLE | NOCYCLE]
;

语句中各参数的说明如下:

参数说明默认值

START WITH

Sequence 的起始值。

说明

START WITH 需大于等于 MINVALUE,且小于 MAXVALUE。

1

MINVALUE

Sequence 的最小值。

说明

MINVALUE 需小于等于 MAXVALUE。

1

MAXVALUE

Sequence 的最大值。

说明

MAXVALUE 需大于等于 MINVALUE。

9223372036854775807

INCREMENT BY

Sequence 每次增加的值(补偿)。

说明

INCREMENT BY 需大于等于 1。

1

CACHE | NOCACHESequence 缓存的大小,避免每次获取 nextval 都需要更新磁盘数据,提高性能。重启后缓存中的数据会丢失,nextval 会跳变到下一个 cache 的值。10000
CYCLE | NOCYCLE表示 Sequence 如果用完了后,是否允许从 MINVALUE 重新开始。0

说明

以上参数均不能为负数。


为了兼容 MySQL Dump 的备份方式,您也可以使用 Engine=Sequence 的方式创建 Sequence。通过插入一行初始数据的方式指定 Sequence 的参数,Sequence 的参数以第一行记录为准。通过 Engine=Sequence 的方式创建的 Sequence,支持用户使用 MySQL Dump 这类工具进行下载、备份和恢复。示例如下:

CREATE TABLE <数据库名>.<Sequence名称> (
  `currval` bigint(21) NOT NULL COMMENT 'current value',
  `nextval` bigint(21) NOT NULL COMMENT 'next value',
  `minvalue` bigint(21) NOT NULL COMMENT 'min value',
  `maxvalue` bigint(21) NOT NULL COMMENT 'max value',
  `start` bigint(21) NOT NULL COMMENT 'start value',
  `increment` bigint(21) NOT NULL COMMENT 'increment value',
  `cache` bigint(21) NOT NULL COMMENT 'cache size',
  `cycle` bigint(21) NOT NULL COMMENT 'cycle state',
  `round` bigint(21) NOT NULL COMMENT 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1;
INSERT INTO <数据库名>.<Sequence名称> VALUES(0, 0, 1, 9223372036854775807, 1, 1, 10000, 0, 0);

删除 Sequence

可通过 DROP SEQUENCEDROP TABLE语句删除 Sequence。

  • 通过 DROP SEQUENCE 语句

    DROP SEQUENCE <数据库名>.<Sequence名称>;
    
  • 通过DROP TABLE语句

    DROP TABLE <数据库名>.<Sequence名称>;
    

获取 nextval

可通过 nextval() 函数或访问 Sequence 表中的 nextval 列来获取 nextval。

  • 通过 nextval() 函数

    SELECT nextval(<数据库名>.<Sequence名称>);
    
  • 通过访问 Sequence 表中的 nextval

    SELECT <数据库名>.<Sequence名称>.nextval from dual;
    

注意

SELECT nextval from <数据库名>.<Sequence名称>; 等同于查询 Sequence 表中的记录,而不是获取 Sequence 的下一个值。

获取 currval

可通过 currval() 函数或访问 Sequence 表中的 currval 列来获取 currval(当前会话中上一次获取的 nextval 的值)。

  • 通过 currval() 函数

    SELECT currval(<数据库名>.<Sequence名称>);
    
  • 通过访问 Sequence 表中的 currval

    SELECT <数据库名>.<Sequence名称>.currval from dual;
    

注意

  • SELECT currval from <数据库名>.<Sequence名称>;等于同查询 Sequence 表中的记录,而不是获取 Sequence 的当前值。
  • 对于新创建的 Sequence,需要先调用一次该 Sequence 的 NEXTVAL 才能正常进行查询,否则会报 Sequence 'xxx' is not yet defined in current session 错误。
  • 如果代理终端的连接池模式为事务级连接池,可能会导致获取的 currval 值不对。如需获取准确的 currval 值,请使用直连模式的代理终端,或关闭实例的数据库代理。

查看 Sequence

可以通过SHOW语句查看到 Sequence 的具体属性。

SHOW CREATE SEQUENCE <数据库名>.<Sequence名称>