全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
分布式关系型数据库 DRDS

Sequence 显式用法

更新时间:2017-08-07 15:19:13

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

创建 Sequence

语法:

  1. CREATE [ GROUP | SIMPLE | TIME ] SEQUENCE <name>
  2. [ START WITH <numeric value> ] [ INCREMENT BY <numeric value> ]
  3. [ MAXVALUE <numeric value> ] [ CYCLE | NOCYCLE ]

参数说明:

参数 解释说明 适用范围
START WITH Sequence 的起始值,若未指定,则默认值为1。 Simple Sequence、Group Sequence
INCREMENT BY Sequence 每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1。 Simple Sequence
MAXVALUE Sequence 允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值。 Simple Sequence
CYCLE 或 NOCYCLE 两者只能选择其一,代表当 Sequence 值增长到最大值后,是否允许继续循环(即仍从 START WITH 开始)使用 Sequence 值。若未指定,则默认值为 NOCYCLE。 Simple Sequence

注意:

  • 如果未指定类型关键字,则默认类型为 Group Sequence;
  • INCREMENT BYMAXVALUECYCLE 或 NOCYCLE这三个参数对于 Group Sequence 是无意义的;
  • START WITHINCREMENT BYMAXVALUECYCLE 或 NOCYCLE这4个参数对于 Time-based Sequence 是无意义的。
  • Group Sequence 是非连续的。START WITH 参数对于 Group Sequence 仅具有指导意义,Group Sequence 不会严格按照该参数作为起始值,但是保证起始值比该参数大

以下为创建不同类型 Sequence 的几个示例。

示例一:创建一个 Group Sequence。

  • 方法一:

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

    1. mysql> CREATE GROUP SEQUENCE seq1;
    2. Query OK, 1 row affected (0.27 sec)

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

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

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

  1. mysql> CREATE SIMPLE SEQUENCE seq2 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 的参数:起始值;
  • 不同类型 Sequence 间的转换。

语法:

  1. ALTER SEQUENCE <name> [ CHANGE TO GROUP | SIMPLE | TIME ]
  2. START WITH <numeric value> [ INCREMENT BY <numeric value> ]
  3. [ MAXVALUE <numeric value> ] [ CYCLE | NOCYCLE ]

参数说明:

参数 解释说明 适用范围
START WITH Sequence 的起始值,若未指定,则默认值为1。 Simple Sequence、Group Sequence
INCREMENT BY Sequence 每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1。 Simple Sequence
MAXVALUE Sequence 允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值。 Simple Sequence
CYCLE 或 NOCYCLE 两者只能选择其一,代表当 Sequence 值增长到最大值后,是否允许继续循环(即仍从 START WITH 开始)使用 Sequence 值。若未指定,则默认值为 NOCYCLE。 Simple Sequence

注意:

  • Group Sequence 是非连续的。START WITH 参数对于 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 参数值。

示例:

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

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

不同类型 Sequence 间的转换

  • 通过ALTER SEQUENCECHANGE TO <sequence_type>子句实现;
  • ALTER SEQUENCE 如果指定了 CHANGE TO子句,则强制必须加上 START WITH 参数,避免忘记指定起始值而造成取值时得到重复值;若没有 CHANGE TO(可选参数),则不强制。

示例:

将 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 | INCREMENT_BY | START_WITH | MAX_VALUE | CYCLE | TYPE |
  4. +------------+---------------------+--------------+------------+---------------------+-------+--------+
  5. | AUTO_SEQ_1 | 91820513 | 1 | 91820200 | 9223372036854775807 | N | SIMPLE |
  6. | AUTO_SEQ_4 | 91820200 | 2 | 1000 | 9223372036854775807 | Y | SIMPLE |
  7. | seq_test | N/A | N/A | N/A | N/A | N/A | TIME |
  8. | AUTO_SEQ_2 | 100000 | N/A | N/A | N/A | N/A | GROUP |
  9. | AUTO_SEQ_3 | 200000 | N/A | N/A | N/A | N/A | GROUP |
  10. +------------+---------------------+--------------+------------+---------------------+-------+--------+
  11. 5 rows in set (0.01 sec)

获取显式 Sequence 值

语法:

  1. < 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 < sequence name >.NEXTVAL FROM DUAL WHERE COUNT = < numeric value >

示例:

  1. 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)
本文导读目录