有奖捉虫:行业应用 & 管理与支持文档专题 HOT
关键字 Sequence 语法和 MariaDB/Oracle 兼容,但是保证分布式全局递增且唯一,具体使用如下:
TDSQL_INCREMENT BY 设置序列步长,正数表示升序序列,负数表示降序序列。设置值必须在序列最大值与最小值之间,缺省则默认1。
START WITH 设置序列起始值,缺省则默认序列最小值。
TDSQL_MAXVALUE 和 TDSQL_NOMAXVALUE 设置序列最大值,TDSQL_MAXVALUE 缺省或者设置TDSQL_NOMAXVALUE 时,递增序列最大值为9223372036854775807,递减序列最大值为-1。
TDSQL_MINVALUE 和 TDSQL_NOMINVALUE 设置序列最小 TDSQL_MINVALUE 缺省或者设置TDSQL_NOMINVALUE 时,递增序列最小值为1,递减序列最小值为-9223372036854775808。
TDSQL_CYCLE 和 TDSQL_NOCYCLE 设置序列是否循环,缺省默认不循环。
TDSQL_CACHE 和 TDSQL_NOCACHE 设置缓存序列数量,缺省默认缓存20。
TDSQL_ORDER 和 TDSQL_NOORDER。设置序列对于并发请求保证完全有序。TDSQL 目前仅支持无序。
说明:
在 TDSQL MySQL 版分布式数据库当中使用 Sequence 时,须在该关键字前面加 tdsql_ 前缀,且要求 proxy 版本最低为1.19.5-M-V2.0R745D005;可通过数据库管理语句 /*Proxy*/show status 查询 proxy 版本,若 proxy 版本较老可以 提交工单 进行升级。
目前 Sequence 为保证分布式全局数值唯一,导致性能较差,主要适用于并发不高的场景。
创建序列需要 CREATE SEQUENCE 系统权限。序列的创建语法如下:
  CREATE TDSQL_SEQUENCE 序列名
  [START WITH n]
  [{TDSQL_MINVALUE | TDSQL_MAXVALUE} n | TDSQL_NOMINVALUE | TDSQL_NOMAXVALUE]
  [TDSQL_INCREMENT BY n]
  [{TDSQL_CYCLE|TDSQL_NOCYCLE}]
  [{TDSQL_CACHE|TDSQL_NOCACHE} n]

创建 Sequence

create tdsql_sequence test.s1 start with 12 tdsql_minvalue 10 maxvalue 50000 tdsql_increment by 5 tdsql_nocycle
create tdsql_sequence test.s2 start with 12 tdsql_minvalue 10 maxvalue 50000 tdsql_increment by 1 tdsql_cycle
以上 SQL 语句包含开始值、最小值、最大值、步长、缓存大小及是否回绕6个参数。
参数默认值,开始值(1)、最小值(1)、最大值(LONGLONG_MAX-1)、步长(1)、是否回绕(0)。

删除 Sequence

drop tdsql_sequence test.s1

查询 Sequence

show create tdsql_sequence test.s1

使用 Sequence

使用 Sequence 获取下一个数值

select tdsql_nextval(test.s2)
select next value for test.s2
mysql> select tdsql_nextval(test.s1);
+----+
| 12 |
+----+
| 12 |
+----+
1 row in set (0.18 sec)

mysql> select tdsql_nextval(test.s2);
+----+
| 12 |
+----+
| 12 |
+----+
1 row in set (0.13 sec)

mysql> select tdsql_nextval(test.s1);
+----+
| 17 |
+----+
| 17 |
+----+
1 row in set (0.01 sec)

mysql> select tdsql_nextval(test.s2);
+----+
| 13 |
+----+
| 13 |
+----+
1 row in set (0.00 sec)

mysql> select next value for test.s1;
+----+
| 22 |
+----+
| 22 |
+----+
1 row in set (0.01 sec)

nextval 可以用在 insert 等地方

mysql> create database test;
Query OK, 0 rows affected (0.29 sec)

mysql> create table test.t1 (a int, b int, PRIMARY KEY (b));
Query OK, 0 rows affected (0.15 sec)

mysql> insert into test.t1(a,b) values(11,2);
Query OK, 1 row affected (0.03 sec)

mysql> select * from test.t1;
+----+------+
| a | b |
+----+------+
| 11 | 2 |
+----+------+
1 row in set (0.00 sec)

mysql> insert into test.t1(a,b) values(tdsql_nextval(test.s2),3);
Query OK, 1 row affected (0.01 sec)

mysql> select * from test.t1;
+----+------+
| a | b |
+----+------+
| 11 | 2 |
| 14 | 3 |
+----+------+
2 rows in set (0.00 sec)
如需获取上一次的值以连接相关数据:如果之前没有用 nextval 命令获取过数据,数值将返回为0。
select tdsql_lastval(test.s1)
select tdsql_previous value for test.s1;
mysql> select tdsql_lastval(test.s1);
+----+
| 22 |
+----+
| 22 |
+----+
1 row in set (0.00 sec)

mysql> select tdsql_previous value for test.s1;
+----+
| 22 |
+----+
| 22 |
+----+
1 row in set (0.00 sec)
设置下一个序列数值,只能比当前数值大,否则将返回数值为0。
select tdsql_setval(test.s2,1000,bool use) // use 默认为1,表示1000这个值用过了,下一次不包含1000,如果为0,则下一个从1000开始。
设置下一个序列数值时,如果比当前数值小,则设置不生效。
mysql> select tdsql_nextval(test.s2);
+----+
| 15 |
+----+
| 15 |
+----+
1 row in set (0.01 sec)

mysql> select tdsql_setval(test.s2,10);
+---+
| 0 |
+---+
| 0 |
+---+
1 row in set (0.03 sec)

mysql> select tdsql_nextval(test.s2);
+----+
| 16 |
+----+
| 16 |
+----+
如果比当前数值大,成功返回当前设置的值。
mysql> select tdsql_setval(test.s2,20);
+----+
| 20 |
+----+
| 20 |
+----+
1 row in set (0.02 sec)
mysql> select tdsql_nextval(test.s2);
+----+
| 21 |
+----+
| 21 |
+----+
1 row in set (0.01 sec)
强制设置下一个序列数值,允许设置比当前数值小的值。
select tdsql_resetval(test.s2,1000)
如果强制设置成功,返回当前设置的值,下一个序列数值从该值开始。
mysql> select tdsql_resetval(test.s2,14);
+----+
| 14 |
+----+
| 14 |
+----+
1 row in set (0.00 sec)

mysql> select tdsql_nextval(test.s2);
+----+
| 14 |
+----+
| 14 |
+----+
1 row in set (0.01 sec)
需要注意,Sequence 的部分关键字以 TDSQL_ 前缀开始:
说明:
若已打开 oldstyle 配置项,proxy 将兼容标准 Sequence 关键字,即关键字前可不添加TDSQL_ 前缀。
TDSQL_CYCLE
TDSQL_INCREMENT
TDSQL_LASTVAL
TDSQL_MINVALUE
TDSQL_NEXTVAL
TDSQL_NOCACHE
TDSQL_NOCYCLE
TDSQL_NOMAXVALUE
TDSQL_NOMINVALUE
TDSQL_PREVIOUS
TDSQL_RESTART
TDSQL_REUSE
TDSQL_SEQUENCE
TDSQL_SETVAL