本文介绍如何用 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)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。