本文介绍云数据库 MySQL 版为 MySQL 5.7 实例中提供的 Sequence Engine。
云数据库 MySQL 版为 MySQL 5.7 版本实例提供了 Sequence Engine,用于获取唯一递增序列值。Sequence Engine 是一个逻辑引擎,底层仍使用 InnoDB 存储引擎进行数据持久化,可以兼容现有的数据备份恢复工具。上层通过封装,实现了序列值生成、缓存等等功能。
已创建 MySQL 5.7 版本实例且实例处于运行中状态。具体操作,请参见创建实例。
通过 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 | NOCACHE | Sequence 缓存的大小,避免每次获取 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);
可通过 DROP SEQUENCE
和 DROP TABLE
语句删除 Sequence。
通过 DROP SEQUENCE
语句
DROP SEQUENCE <数据库名>.<Sequence名称>;
通过DROP TABLE
语句
DROP TABLE <数据库名>.<Sequence名称>;
可通过 nextval()
函数或访问 Sequence 表中的 nextval
列来获取 nextval。
通过 nextval()
函数
SELECT nextval(<数据库名>.<Sequence名称>);
通过访问 Sequence 表中的 nextval
列
SELECT <数据库名>.<Sequence名称>.nextval from dual;
注意
SELECT nextval from <数据库名>.<Sequence名称>;
等同于查询 Sequence 表中的记录,而不是获取 Sequence 的下一个值。
可通过 currval()
函数或访问 Sequence 表中的 currval
列来获取 currval(当前会话中上一次获取的 nextval 的值)。
通过 currval()
函数
SELECT currval(<数据库名>.<Sequence名称>);
通过访问 Sequence 表中的 currval
列
SELECT <数据库名>.<Sequence名称>.currval from dual;
注意
SELECT currval from <数据库名>.<Sequence名称>;
等于同查询 Sequence 表中的记录,而不是获取 Sequence 的当前值。Sequence 'xxx' is not yet defined in current session
错误。可以通过SHOW
语句查看到 Sequence 的具体属性。
SHOW CREATE SEQUENCE <数据库名>.<Sequence名称>