开发者社区> 问答> 正文

Sequence 显式用法

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

创建 Sequence
修改 Sequence
删除 Sequence
查询 Sequence
获取显式 Sequence 值
批量获取 Sequence 值
创建 Sequence

语法:

CREATE [ GROUP | SIMPLE | TIME ] SEQUENCE <name>
[ START WITH <numeric value> ] [ INCREMENT BY <numeric value> ]
[ 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 BY、MAXVALUE、CYCLE 或 NOCYCLE这三个参数对于 Group Sequence 是无意义的;
START WITH、INCREMENT BY、MAXVALUE、CYCLE 或 NOCYCLE这4个参数对于 Time-based Sequence 是无意义的。
Group Sequence 是非连续的。START WITH 参数对于 Group Sequence 仅具有指导意义,Group Sequence 不会严格按照该参数作为起始值,但是保证起始值比该参数大。
以下为创建不同类型 Sequence 的几个示例。

示例一:创建一个 Group Sequence。

方法一:

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

mysql> CREATE GROUP SEQUENCE seq1;
Query OK, 1 row affected (0.27 sec)
示例二:创建一个 Time-based Sequence。

mysql> CREATE TIME SEQUENCE seq1;
Query OK, 1 row affected (0.27 sec)
示例三: 创建一个 Simple Sequence,起始值是 1000,步长为 2,最大值为 99999999999,增长到最大值后不继续循环。

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

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

修改 Simple Sequence 的参数:起始值、步长、最大值、循环或非循环;
修改 Group Sequence 的参数:起始值;
不同类型 Sequence 间的转换。
语法:

ALTER SEQUENCE <name> [ CHANGE TO GROUP | SIMPLE | TIME ]
START WITH <numeric value> [ INCREMENT BY <numeric value> ]
[ 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,增长到最大值后改为继续循环。

mysql> ALTER SEQUENCE seq2 START WITH 3000 INCREMENT BY 5 MAXVALUE 1000000 CYCLE;
Query OK, 1 row affected (0.01 sec)
不同类型 Sequence 间的转换

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

将 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               | INCREMENT_BY | START_WITH | MAX_VALUE           | CYCLE | TYPE   |
+------------+---------------------+--------------+------------+---------------------+-------+--------+
| AUTO_SEQ_1 | 91820513            | 1            | 91820200   | 9223372036854775807 | N     | SIMPLE |
| AUTO_SEQ_4 | 91820200            | 2            | 1000       | 9223372036854775807 | Y     | SIMPLE |
| seq_test   | N/A                 | N/A          | N/A        | N/A                 | N/A   | TIME   |
| AUTO_SEQ_2 | 100000              | N/A          | N/A        | N/A                 | N/A   | GROUP  |
| AUTO_SEQ_3 | 200000              | N/A          | N/A        | N/A                 | N/A   | GROUP  |
+------------+---------------------+--------------+------------+---------------------+-------+--------+
5 rows in set (0.01 sec)
获取显式 Sequence 值

语法:

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

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)

展开
收起
猫饭先生 2017-10-30 13:49:31 1699 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载