全部产品
云市场

Sequence 显式用法

更新时间:2019-03-04 15:38:42

本文介绍如何用 DDL 语句创建、修改、删除、查询 Sequence, 以及如何获取显式 Sequence 的值。

创建 Sequence

Group Sequence

  1. CREATE [ GROUP ] SEQUENCE <name>
  2. [ START WITH <numeric value> ]
参数 说明
START WITH Group Sequence 的起始值,若未指定,则默认起始值为100001。

单元化 Group Sequence

  1. CREATE [ GROUP ] SEQUENCE <name>
  2. [ START WITH <numeric value> ]
  3. [ 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

  1. CREATE TIME SEQUENCE <name>

注意:存储 Time-based Sequence 值的列必须为 BIGINT 类型。

Simple Sequence

  1. CREATE SIMPLE SEQUENCE <name>
  2. [ START WITH <numeric value> ]
  3. [ INCREMENT BY <numeric value> ]
  4. [ MAXVALUE <numeric value> ]
  5. [ 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。

  • 方法一:
  1. mysql> CREATE SEQUENCE seq1;
  2. Query OK, 1 row affected (0.01 sec)
  • 方法二:
  1. mysql> CREATE GROUP SEQUENCE seq1;
  2. Query OK, 1 row affected (0.01 sec)

示例二:创建包含3个单元的全局唯一数字序列(将3个同名的、指定了相同单元数量和不同单元索引的单元化 Group Sequence,分别用于3个不同的实例或库,组成一个全局唯一数字序列)。

实例1/库1:

  1. mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 0;
  2. Query OK, 1 row affected (0.01 sec)

实例2/库2:

  1. mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 1;
  2. Query OK, 1 row affected (0.01 sec)

实例3/库3:

  1. mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 2;
  2. Query OK, 1 row affected (0.01 sec)

示例三:创建一个 Time-based Sequence。

  1. mysql> CREATE TIME SEQUENCE seq3;
  2. Query OK, 1 row affected (0.03 sec)

示例四: 创建一个 Simple Sequence,起始值是 1000,步长为 2,最大值为 99999999999,增长到最大值后不继续循环。

  1. mysql> CREATE SIMPLE SEQUENCE seq4 START WITH 1000 INCREMENT BY 2 MAXVALUE 99999999999 NOCYCLE;
  2. Query OK, 1 row affected (0.03 sec)

修改 Sequence

DRDS 支持对 Sequence 的以下几个方面进行修改:

  • 修改 Simple Sequence 的参数:起始值、步长、最大值、循环或非循环;
  • 修改 Group Sequence 或单元化 Group Sequence 的参数:起始值;
  • 不同类型 Sequence 间的转换(单元化 Group Sequence 除外)。

Group Sequence

  1. ALTER SEQUENCE <name> [ CHANGE TO SIMPLE | TIME ]
  2. START WITH <numeric value>
  3. [ INCREMENT BY <numeric value> ]
  4. [ MAXVALUE <numeric value> ]
  5. [ 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

  1. ALTER SEQUENCE <name>
  2. START WITH <numeric value>
参数 说明
START WITH 单元化 Group Sequence 的起始值,无默认值,若未指定则忽略该参数。

注意:单元化 Group Sequence 不支持转换到其它类型或修改单元化相关的参数。

Time-based Sequence

  1. ALTER SEQUENCE <name> [ CHANGE TO GROUP | SIMPLE ]
  2. START WITH <numeric value>
  3. [ INCREMENT BY <numeric value> ]
  4. [ MAXVALUE <numeric value> ]
  5. [ 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

  1. ALTER SEQUENCE <name> [ CHANGE TO GROUP | TIME ]
  2. START WITH <numeric value>
  3. [ INCREMENT BY <numeric value> ]
  4. [ MAXVALUE <numeric value> ]
  5. [ 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 SEQUENCECHANGE TO <sequence_type> 子句实现;
  • ALTER SEQUENCE 如果指定了 CHANGE TO 子句,则强制必须加上 START WITH 参数,避免忘记指定起始值而造成取值时得到重复值;若没有 CHANGE TO(可选参数),则不强制;
  • 不支持单元化 Group Sequence 作为源或目标的类型转换。

示例

示例一:将 Simple Sequence seq4 的起始值改为 3000,步长改为 5,最大值改为 1000000,增长到最大值后改为继续循环。

  1. mysql> ALTER SEQUENCE seq4 START WITH 3000 INCREMENT BY 5 MAXVALUE 1000000 CYCLE;
  2. Query OK, 1 row affected (0.01 sec)

示例二:将 Group Sequence 转换为 Simple Sequence。

  1. mysql> ALTER SEQUENCE seq1 CHANGE TO SIMPLE START WITH 1000000;
  2. Query OK, 1 row affected (0.02 sec)

删除 Sequence

语法

  1. DROP SEQUENCE <name>

示例

  1. mysql> DROP SEQUENCE seq3;
  2. Query OK, 1 row affected (0.02 sec)

查询 Sequence

语法

  1. SHOW SEQUENCES

结果集中的 TYPE 列,显示的是 Sequence 类型的缩写。

示例

  1. mysql> SHOW SEQUENCES;
  2. +------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
  3. | NAME | VALUE | UNIT_COUNT | UNIT_INDEX | INNER_STEP | INCREMENT_BY | START_WITH | MAX_VALUE | CYCLE | TYPE |
  4. +------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
  5. | seq1 | 100000 | 1 | 0 | 100000 | N/A | N/A | N/A | N/A | GROUP |
  6. | seq2 | 400000 | 3 | 1 | 100000 | N/A | N/A | N/A | N/A | GROUP |
  7. | seq3 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | TIME |
  8. | seq4 | 1006 | N/A | N/A | N/A | 2 | 1000 | 99999999999 | N | SIMPLE |
  9. +------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
  10. 4 rows in set (0.00 sec)

获取显式 Sequence 值

语法

  1. [<schema_name>.]<sequence name>.NEXTVAL

示例

  1. SELECT sample_seq.nextval FROM dual;
  2. +--------------------+
  3. | SAMPLE_SEQ.NEXTVAL |
  4. +--------------------+
  5. | 101001 |
  6. +--------------------+
  7. 1 row in set (0.04 sec)

或者可以把这个 sample_seq.nextval 当做一个值写入 SQL 中:

  1. mysql> INSERT INTO some_users (name,address,gmt_create,gmt_modified,intro) VALUES ('sun',sample_seq.nextval,now(),now(),'aa');
  2. Query OK, 1 row affected (0.01 sec)

注意:如果建表时已经指定了 AUTO_INCREMENT 参数,INSERT 时不需要指定自增列,可以让 DRDS 自动维护。

批量获取 Sequence 值

语法

  1. SELECT [<schema_name>.]<sequence name>.NEXTVAL FROM DUAL WHERE COUNT = <numeric value>

示例

  1. mysql> SELECT sample_seq.nextval FROM dual WHERE count = 10;
  2. +--------------------+
  3. | SAMPLE_SEQ.NEXTVAL |
  4. +--------------------+
  5. | 101002 |
  6. | 101003 |
  7. | 101004 |
  8. | 101005 |
  9. | 101006 |
  10. | 101007 |
  11. | 101008 |
  12. | 101009 |
  13. | 101010 |
  14. | 101011 |
  15. +--------------------+
  16. 10 row in set (0.04 sec)