本文介绍如何用 DDL 语句创建、修改、删除、查询 Sequence, 以及如何获取显式 Sequence 的值。
创建 Sequence
Group Sequence
CREATE [ GROUP ] SEQUENCE <name>
[ START WITH <numeric value> ]
参数 | 说明 |
---|---|
START WITH | Group Sequence 的起始值,若未指定,则默认起始值为100001。 |
单元化 Group Sequence
CREATE [ GROUP ] SEQUENCE <name>
[ START WITH <numeric value> ]
[ UNIT COUNT <numeric value> INDEX <numeric value> ]
参数 | 说明 |
---|---|
START WITH | 单元化 Group Sequence 的起始值,默认起始值依赖于单元数量和单元索引;若单元数量和单元索引未被指定或为默认值,则默认起始值为100001。 |
UNIT COUNT | 单元化 Group Sequence 的单元数量,默认值为1 |
INDEX | 单元化 Group Sequence 的单元索引,取值范围为 [ 0, 单元数量 – 1 ],默认值为0 |
注意:
- 若单元化 Group Sequence 的参数 UNIT COUNT 和 INDEX 均未指定或均为默认值,则等价于 Group Sequence;
- 属于同一个全局唯一数字序列分配空间的每个单元化 Group Sequence,必须指定相同的单元数量和不同的单元索引。
Time-based Sequence
CREATE TIME SEQUENCE <name>
注意:存储 Time-based Sequence 值的列必须为 BIGINT 类型。
Simple Sequence
CREATE SIMPLE SEQUENCE <name>
[ START WITH <numeric value> ]
[ INCREMENT BY <numeric value> ]
[ MAXVALUE <numeric value> ]
[ CYCLE | NOCYCLE ]
参数 | 说明 |
---|---|
START WITH | Simple Sequence 的起始值,若未指定,则默认起始值为1。 |
INCREMENT BY | Simple Sequence 每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1。 |
MAXVALUE | Simple Sequence 允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值,即 9223372036854775807。 |
CYCLE 或 NOCYCLE | 两者只能选择其一,代表当 Simple Sequence 增长到最大值后,是否允许继续循环(即从 START WITH 重新开始)使用该 Simple Sequence。若未指定,则默认值为 NOCYCLE。 |
注意事项
- 如果未指定类型关键字,则默认类型为 Group Sequence;
- Group Sequence 和单元化 Group Sequence 是非连续的。
START WITH
参数对于它们仅具有指导意义,Group Sequence 和单元化 Group Sequence 不会严格按照该参数作为起始值,但是保证起始值比该参数大; - 可以将 Group Sequence 看作单元化 Group Sequence 的一个特例,即 UNIT COUNT = 1 且 INDEX = 0 时的单元化 Group Sequence。
示例
示例一:创建一个 Group Sequence。
- 方法一:
mysql> CREATE SEQUENCE seq1;
Query OK, 1 row affected (0.01 sec)
- 方法二:
mysql> CREATE GROUP SEQUENCE seq1;
Query OK, 1 row affected (0.01 sec)
示例二:创建包含3个单元的全局唯一数字序列(将3个同名的、指定了相同单元数量和不同单元索引的单元化 Group Sequence,分别用于3个不同的实例或库,组成一个全局唯一数字序列)。
实例1/库1:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 0;
Query OK, 1 row affected (0.01 sec)
实例2/库2:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 1;
Query OK, 1 row affected (0.01 sec)
实例3/库3:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 2;
Query OK, 1 row affected (0.01 sec)
示例三:创建一个 Time-based Sequence。
mysql> CREATE TIME SEQUENCE seq3;
Query OK, 1 row affected (0.03 sec)
示例四: 创建一个 Simple Sequence,起始值是 1000,步长为 2,最大值为 99999999999,增长到最大值后不继续循环。
mysql> CREATE SIMPLE SEQUENCE seq4 START WITH 1000 INCREMENT BY 2 MAXVALUE 99999999999 NOCYCLE;
Query OK, 1 row affected (0.03 sec)
修改 Sequence
DRDS 支持对 Sequence 的以下几个方面进行修改:
- 修改 Simple Sequence 的参数:起始值、步长、最大值、循环或非循环;
- 修改 Group Sequence 或单元化 Group Sequence 的参数:起始值;
- 不同类型 Sequence 间的转换(单元化 Group Sequence 除外)。
Group Sequence
ALTER SEQUENCE <name> [ CHANGE TO SIMPLE | TIME ]
START WITH <numeric value>
[ INCREMENT BY <numeric value> ]
[ MAXVALUE <numeric value> ]
[ CYCLE | NOCYCLE ]
参数 | 说明 |
---|---|
START WITH | Sequence 的起始值,无默认值,若未指定则忽略该参数,在转换类型时必须指定。 |
INCREMENT BY | 仅在将 Group Sequence 转换为 Simple Sequence 时有效,是 Simple Sequence 每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1。 |
MAXVALUE | 仅在将 Group Sequence 转换为 Simple Sequence 时有效,是 Simple Sequence 允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值,即 9223372036854775807。 |
CYCLE 或 NOCYCLE | 仅在将 Group Sequence 转换为 Simple Sequence 时有效,两者只能选择其一,代表当 Simple Sequence 值增长到最大值后,是否允许继续循环(即从 START WITH 重新开始)使用该 Simple Sequence,若未指定,则默认值为 NOCYCLE。 |
注意:当修改的目标类型为 TIME 时,不支持上述参数。
单元化 Group Sequence
ALTER SEQUENCE <name>
START WITH <numeric value>
参数 | 说明 |
---|---|
START WITH | 单元化 Group Sequence 的起始值,无默认值,若未指定则忽略该参数。 |
注意:单元化 Group Sequence 不支持转换到其它类型或修改单元化相关的参数。
Time-based Sequence
ALTER SEQUENCE <name> [ CHANGE TO GROUP | SIMPLE ]
START WITH <numeric value>
[ INCREMENT BY <numeric value> ]
[ MAXVALUE <numeric value> ]
[ CYCLE | NOCYCLE ]
参数 | 说明 |
---|---|
START WITH | Sequence 的起始值,无默认值,若未指定则忽略该参数,在转换类型时必须指定。 |
INCREMENT BY | Simple Sequence 每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1,将 Simple Sequence 转换为 Group Sequence 时该参数无效。 |
MAXVALUE | Simple Sequence 允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值,即 9223372036854775807,将 Simple Sequence 转换为 Group Sequence 时该参数无效。 |
CYCLE 或 NOCYCLE | 两者只能选择其一,代表当 Simple Sequence 值增长到最大值后,是否允许继续循环(即仍从 START WITH 开始)使用该 Simple Sequence,若未指定,则默认值为 NOCYCLE,将 Simple Sequence 转换为 Group Sequence 时该参数无效。 |
Simple Sequence
ALTER SEQUENCE <name> [ CHANGE TO GROUP | TIME ]
START WITH <numeric value>
[ INCREMENT BY <numeric value> ]
[ MAXVALUE <numeric value> ]
[ CYCLE | NOCYCLE ]
参数 | 说明 |
---|---|
START WITH | Sequence 的起始值,无默认值,若未指定则忽略该参数,在转换类型时必须指定。 |
INCREMENT BY | Simple Sequence 每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1,将 Simple Sequence 转换为 Group Sequence 时该参数无效。 |
MAXVALUE | Simple Sequence 允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值,即 9223372036854775807,将 Simple Sequence 转换为 Group Sequence 时该参数无效。 |
CYCLE 或 NOCYCLE | 两者只能选择其一,代表当 Simple Sequence 值增长到最大值后,是否允许继续循环(即仍从 START WITH 开始)使用该 Simple Sequence,若未指定,则默认值为 NOCYCLE,将 Simple Sequence 转换为 Group Sequence 时该参数无效。 |
注意:当修改的目标类型为 TIME 时,不支持上述参数。
注意事项
- Group Sequence 和单元化 Group Sequence 是非连续的。
START WITH
参数对于它们仅具有指导意义,Group Sequence 和单元化 Group Sequence 不会严格按照该参数作为起始值,但是保证起始值比该参数大; - 单元化 Group Sequence 不支持转换到其它类型或修改单元化相关的参数;
- 对于 Simple Sequence,如果修改 Sequence 时指定了 START WITH,则会立即生效,下次取 Sequence 值时会从新的 START WITH 值开始。比如原先 Sequene 增长到 100,这时把 START WITH 值改成了 200,那么下一次获取的 Sequence 值就从 200 开始。
- 修改 START WITH 的参数值时,需要仔细评估已经产生的 Sequence 值,以及生成新 Sequence 值的速度,防止产生冲突。如非必要,请谨慎修改 START WITH 参数值。
不同类型 Sequence 间的转换
- 通过
ALTER SEQUENCE
的CHANGE TO <sequence_type>
子句实现; - ALTER SEQUENCE 如果指定了
CHANGE TO
子句,则强制必须加上 START WITH 参数,避免忘记指定起始值而造成取值时得到重复值;若没有 CHANGE TO(可选参数),则不强制; - 不支持单元化 Group Sequence 作为源或目标的类型转换。
示例
示例一:将 Simple Sequence seq4 的起始值改为 3000,步长改为 5,最大值改为 1000000,增长到最大值后改为继续循环。
mysql> ALTER SEQUENCE seq4 START WITH 3000 INCREMENT BY 5 MAXVALUE 1000000 CYCLE;
Query OK, 1 row affected (0.01 sec)
示例二:将 Group Sequence 转换为 Simple Sequence。
mysql> ALTER SEQUENCE seq1 CHANGE TO SIMPLE START WITH 1000000;
Query OK, 1 row affected (0.02 sec)
删除 Sequence
语法
DROP SEQUENCE <name>
示例
mysql> DROP SEQUENCE seq3;
Query OK, 1 row affected (0.02 sec)
查询 Sequence
语法
SHOW SEQUENCES
结果集中的 TYPE 列,显示的是 Sequence 类型的缩写。
示例
mysql> SHOW SEQUENCES;
+------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
| NAME | VALUE | UNIT_COUNT | UNIT_INDEX | INNER_STEP | INCREMENT_BY | START_WITH | MAX_VALUE | CYCLE | TYPE |
+------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
| seq1 | 100000 | 1 | 0 | 100000 | N/A | N/A | N/A | N/A | GROUP |
| seq2 | 400000 | 3 | 1 | 100000 | N/A | N/A | N/A | N/A | GROUP |
| seq3 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | TIME |
| seq4 | 1006 | N/A | N/A | N/A | 2 | 1000 | 99999999999 | N | SIMPLE |
+------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
4 rows in set (0.00 sec)
获取显式 Sequence 值
语法
[<schema_name>.]<sequence name>.NEXTVAL
示例
SELECT sample_seq.nextval FROM dual;
+--------------------+
| SAMPLE_SEQ.NEXTVAL |
+--------------------+
| 101001 |
+--------------------+
1 row in set (0.04 sec)
或者可以把这个 sample_seq.nextval 当做一个值写入 SQL 中:
mysql> INSERT INTO some_users (name,address,gmt_create,gmt_modified,intro) VALUES ('sun',sample_seq.nextval,now(),now(),'aa');
Query OK, 1 row affected (0.01 sec)
注意:如果建表时已经指定了 AUTO_INCREMENT 参数,INSERT 时不需要指定自增列,可以让 DRDS 自动维护。
批量获取 Sequence 值
语法
SELECT [<schema_name>.]<sequence name>.NEXTVAL FROM DUAL WHERE COUNT = <numeric value>
示例
mysql> SELECT sample_seq.nextval FROM dual WHERE count = 10;
+--------------------+
| SAMPLE_SEQ.NEXTVAL |
+--------------------+
| 101002 |
| 101003 |
| 101004 |
| 101005 |
| 101006 |
| 101007 |
| 101008 |
| 101009 |
| 101010 |
| 101011 |
+--------------------+
10 row in set (0.04 sec)