创建Sequence
Group Sequence
- 语法
CREATE [ GROUP ] SEQUENCE <name> [ START WITH <numeric value> ]
- 参数说明
参数 | 说明 |
START WITH | Group Sequence 的起始值,若未指定,则默认起始值为100001。 |
- 示例
- 方法一
mysql> CREATE SEQUENCE seq1;
- 方法二
mysql> CREATE GROUP SEQUENCE seq1;
单元化 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。
- Group Sequence 和单元化Group Sequence是非连续的。START WITH参数对于它们仅具有指导意义,Group Sequence 和单元化Group Sequence不会严格按照该参数作为起始值,但是保证起始值比该参数大。
- 可以将Group Sequence看作单元化Group Sequence的一个特例,即UNIT COUNT = 1 且 INDEX = 0 时的单元化Group Sequence。
- 示例创建包含3个单元的全局唯一数字序列(将3个同名的、指定了相同单元数量和不同单元索引的单元化Group Sequence,分别用于3个不同的实例或库,组成一个全局唯一数字序列)。
- 实例1/库1:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 0;
- 实例2/库2:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 1;
- 实例3/库3:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 2;
Time-based Sequence
- 语法
CREATE TIME SEQUENCE <name>
注意 存储Time-based Sequence值的列必须为BIGINT类型。- 示例
7mysql> CREATE TIME SEQUENCE seq3;
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。 |
- 示例创建一个Simple Sequence,起始值是1000,步长为2,最大值为99999999999,增长到最大值后不继续循环。
mysql> CREATE SIMPLE SEQUENCE seq4 START WITH 1000 INCREMENT BY 2 MAXVALUE 99999999999 NOCYCLE;
修改Sequence
PolarDB-X支持对Sequence的各种类型进行如下修改:
- 修改Simple Sequence的参数:起始值、步长、最大值、循环或非循环。
- 修改Group Sequence或单元化 Group Sequence的参数:起始值。
- 不同类型Sequence间的转换(单元化Group Sequence除外)。
注意事项
- 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参数值。
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时,不支持上述参数。
不同类型Sequence间的转换
在对Sequence的不同类型进行转换时,您需要了解如下事项:
- 通过
ALTER SEQUENCE
的CHANGE TO
子句实现。 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;
- 将Group Sequence转换为Simple Sequence。
mysql> ALTER SEQUENCE seq1 CHANGE TO SIMPLE START WITH 1000000;
查询与获取Sequence
查询Sequence
- 语法
SHOW SEQUENCES
- 示例
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)
说明 返回结果中的TYPE列,显示的是Sequence类型的缩写。
获取显式Sequence值
- 语法
[<schema_name>.]<sequence name>.NEXTVAL
- 示例
- 方法一
mysql> SELECT sample_seq.nextval FROM dual;
- 返回结果如下:
+--------------------+ | SAMPLE_SEQ.NEXTVAL | +--------------------+ | 101001 | +--------------------+ 1 row in set (0.04 sec)
- 方法二
mysql> INSERT INTO some_users (name,address,gmt_create,gmt_modified,intro) VALUES ('sun',sample_seq.nextval,now(),now(),'aa');
- 说明
- 该方法是把sample_seq.nextval当做一个值写入了 SQL中。
- 如果建表时已经指定了AUTO_INCREMENT参数,INSERT时不需要指定自增列,可以让PolarDB-X自动维护。
批量获取Sequence值
- 语法批量获取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)
删除Sequence
- 语法
DROP SEQUENCE <name>
- 示例
mysql> DROP SEQUENCE seq3;