Skip to content

Commit 12a66b3

Browse files
authored
Add docs for ALTER SEQUENCE and sequence functions (#17220)
1 parent 3823802 commit 12a66b3

8 files changed

+268
-28
lines changed

TOC.md

+2
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,7 @@
740740
- [`ALTER PLACEMENT POLICY`](/sql-statements/sql-statement-alter-placement-policy.md)
741741
- [`ALTER RANGE`](/sql-statements/sql-statement-alter-range.md)
742742
- [`ALTER RESOURCE GROUP`](/sql-statements/sql-statement-alter-resource-group.md)
743+
- [`ALTER SEQUENCE`](/sql-statements/sql-statement-alter-sequence.md)
743744
- [`ALTER TABLE`](/sql-statements/sql-statement-alter-table.md)
744745
- [`ALTER TABLE COMPACT`](/sql-statements/sql-statement-alter-table-compact.md)
745746
- [`ALTER USER`](/sql-statements/sql-statement-alter-user.md)
@@ -900,6 +901,7 @@
900901
- [其它函数](/functions-and-operators/miscellaneous-functions.md)
901902
- [精度数学](/functions-and-operators/precision-math.md)
902903
- [集合运算](/functions-and-operators/set-operators.md)
904+
- [序列函数](/functions-and-operators/sequence-functions.md)
903905
- [下推到 TiKV 的表达式列表](/functions-and-operators/expressions-pushed-down.md)
904906
- [TiDB 特有的函数](/functions-and-operators/tidb-functions.md)
905907
- [Oracle 与 TiDB 函数和语法差异对照](/oracle-functions-to-tidb.md)

error-codes.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ TiDB 兼容 MySQL 的错误码,在大多数情况下,返回和 MySQL 一样
388388

389389
* Error Number: 8228
390390

391-
在 Sequence 上使用 `setval` 时指定了不支持的类型,该函数的示例可以在 [Sequence 使用文档](/sql-statements/sql-statement-create-sequence.md#示例)中找到。
391+
在 Sequence 上使用 `SETVAL` 时指定了不支持的类型,该函数的示例可以在 [Sequence 使用文档](/sql-statements/sql-statement-create-sequence.md#示例)中找到。
392392

393393
* Error Number: 8229
394394

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
title: 序列函数
3+
summary: 了解 TiDB 中的序列函数。
4+
---
5+
6+
# 序列函数
7+
8+
TiDB 中的序列函数用于返回或设置使用 [`CREATE SEQUENCE`](/sql-statements/sql-statement-create-sequence.md) 语句创建的序列对象的值。
9+
10+
| 函数名称 | 功能描述 |
11+
| :-------- | :-------------------------- |
12+
| `NEXTVAL()``NEXT VALUE FOR` | 返回序列的下一个值 |
13+
| `SETVAL()` | 设置序列的当前值 |
14+
| `LASTVAL()` | 返回序列中最近一个使用过的值 |
15+
16+
## MySQL 兼容性
17+
18+
根据 [ISO/IEC 9075-2](https://www.iso.org/standard/76584.html),MySQL 不支持创建和操作序列的函数和语句。

information-schema/information-schema-sequences.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ DESC SEQUENCES;
3737

3838
```sql
3939
CREATE SEQUENCE test.seq;
40-
SELECT nextval(test.seq);
40+
SELECT NEXTVAL(test.seq);
4141
```
4242

4343
输出结果如下:
4444

4545
```sql
4646
+-------------------+
47-
| nextval(test.seq) |
47+
| NEXTVAL(test.seq) |
4848
+-------------------+
4949
| 1 |
5050
+-------------------+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
---
2+
title: ALTER SEQUENCE
3+
summary: 介绍 ALTER SEQUENCE 在 TiDB 中的使用概况。
4+
---
5+
6+
# ALTER SEQUENCE
7+
8+
`ALTER SEQUENCE` 语句用于在 TiDB 中修改序列对象。序列是一种与 `Table``View` 对象平级的数据库对象,用于生成自定义的序列化 ID。
9+
10+
## 语法图
11+
12+
```ebnf+diagram
13+
CreateSequenceStmt ::=
14+
'ALTER' 'SEQUENCE' TableName CreateSequenceOptionListOpt
15+
16+
TableName ::=
17+
Identifier ('.' Identifier)?
18+
19+
CreateSequenceOptionListOpt ::=
20+
SequenceOption*
21+
22+
SequenceOptionList ::=
23+
SequenceOption
24+
25+
SequenceOption ::=
26+
( 'INCREMENT' ( '='? | 'BY' ) | 'START' ( '='? | 'WITH' ) | ( 'MINVALUE' | 'MAXVALUE' | 'CACHE' ) '='? ) SignedNum
27+
| 'COMMENT' '='? stringLit
28+
| 'NOMINVALUE'
29+
| 'NO' ( 'MINVALUE' | 'MAXVALUE' | 'CACHE' | 'CYCLE' )
30+
| 'NOMAXVALUE'
31+
| 'NOCACHE'
32+
| 'CYCLE'
33+
| 'NOCYCLE'
34+
| 'RESTART' ( ( '='? | 'WITH' ) SignedNum )?
35+
```
36+
37+
## 语法说明
38+
39+
```sql
40+
ALTER SEQUENCE sequence_name
41+
[ INCREMENT [ BY | = ] increment ]
42+
[ MINVALUE [=] minvalue | NO MINVALUE | NOMINVALUE ]
43+
[ MAXVALUE [=] maxvalue | NO MAXVALUE | NOMAXVALUE ]
44+
[ START [ WITH | = ] start ]
45+
[ CACHE [=] cache | NOCACHE | NO CACHE]
46+
[ CYCLE | NOCYCLE | NO CYCLE]
47+
[table_options]
48+
```
49+
50+
## 参数说明
51+
52+
|参数 | 默认值 | 描述 |
53+
| :-- | :-- | :--|
54+
| `INCREMENT` | `1` | 指定序列的步长。其正负值可以控制序列的增长方向。|
55+
| `MINVALUE` | `1``-9223372036854775807` | 指定序列的最小值。当 `INCREMENT` > `0` 时,默认值为 `1`;当 `INCREMENT` < `0` 时,默认值为 `-9223372036854775807`|
56+
| `MAXVALUE` | `9223372036854775806``-1` | 指定序列的最大值。当 `INCREMENT` > `0` 时,默认值为 `9223372036854775806`;当 `INCREMENT` < `0` 时,默认值为 `-1`|
57+
| `START` | `MINVALUE``MAXVALUE` | 指定序列的初始值。当 `INCREMENT` > `0` 时,默认值为 `MINVALUE`; 当 `INCREMENT` < `0` 时,默认值为 `MAXVALUE`|
58+
| `CACHE` | `1000` | 指定每个 TiDB 本地缓存序列的大小。|
59+
| `CYCLE` | `NO CYCLE` | 指定序列用完之后是否要循环使用。在 `CYCLE` 的情况下,当 `INCREMENT` > `0` 时,序列用完后的后续起始值为 `MINVALUE`;当 `INCREMENT` < `0` 时,序列用完后的后续起始值为 `MAXVALUE`|
60+
61+
> **注意:**
62+
>
63+
> 在执行 `ALTER SEQUENCE ... RESTART` 之前,更改 `START` 值不会影响生成的值。
64+
65+
## `SEQUENCE` 函数
66+
67+
主要通过表达式函数来操纵序列的使用。
68+
69+
+ `NEXTVAL``NEXT VALUE FOR`
70+
71+
本质上都是 `NEXTVAL()` 函数,获取序列对象的下一个有效值,其参数为序列的 `identifier`
72+
73+
+ `LASTVAL`
74+
75+
`LASTVAL()` 函数,用于获取本会话上一个使用过的值。如果没有值,则为 `NULL`,其参数为序列的 `identifier`
76+
77+
+ `SETVAL`
78+
79+
`SETVAL()` 函数,用于设置序列的增长。其第一参数为序列的 `identifier`,第二个参数为 `num`
80+
81+
> **注意:**
82+
>
83+
> 在 TiDB 序列的实现中,`SETVAL` 函数并不能改变序列增长的初始步调或循环步调。在 `SETVAL` 之后只会返回符合步调规律的下一个有效的序列值。
84+
85+
## 示例
86+
87+
创建一个名为 `s1` 的序列:
88+
89+
```sql
90+
CREATE SEQUENCE s1;
91+
```
92+
93+
```
94+
Query OK, 0 rows affected (0.15 sec)
95+
```
96+
97+
执行以下 SQL 语句两次,获取该序列接下来的两个值:
98+
99+
```sql
100+
SELECT NEXTVAL(s1);
101+
```
102+
103+
```
104+
+-------------+
105+
| NEXTVAL(s1) |
106+
+-------------+
107+
| 1 |
108+
+-------------+
109+
1 row in set (0.01 sec)
110+
```
111+
112+
```sql
113+
SELECT NEXTVAL(s1);
114+
```
115+
116+
```
117+
+-------------+
118+
| NEXTVAL(s1) |
119+
+-------------+
120+
| 2 |
121+
+-------------+
122+
1 row in set (0.00 sec)
123+
```
124+
125+
将该序列的步长更改为 `2`
126+
127+
```sql
128+
ALTER SEQUENCE s1 INCREMENT=2;
129+
```
130+
131+
```
132+
Query OK, 0 rows affected (0.18 sec)
133+
```
134+
135+
此时,再次获取该序列接下来的两个值:
136+
137+
```sql
138+
SELECT NEXTVAL(s1);
139+
```
140+
141+
```
142+
+-------------+
143+
| NEXTVAL(s1) |
144+
+-------------+
145+
| 1001 |
146+
+-------------+
147+
1 row in set (0.02 sec)
148+
```
149+
150+
```sql
151+
SELECT NEXTVAL(s1);
152+
```
153+
154+
```
155+
+-------------+
156+
| NEXTVAL(s1) |
157+
+-------------+
158+
| 1003 |
159+
+-------------+
160+
1 row in set (0.00 sec)
161+
```
162+
163+
从以上输出中可以看到,在执行了 `ALTER SEQUENCE` 语句后,数值的增幅为 `2`
164+
165+
你还可以更改序列的其他参数。例如,可以按照以下方式更改序列的 `MAXVALUE`
166+
167+
```sql
168+
CREATE SEQUENCE s2 MAXVALUE=10;
169+
```
170+
171+
```
172+
Query OK, 0 rows affected (0.17 sec)
173+
```
174+
175+
```sql
176+
ALTER SEQUENCE s2 MAXVALUE=100;
177+
```
178+
179+
```
180+
Query OK, 0 rows affected (0.15 sec)
181+
```
182+
183+
```sql
184+
SHOW CREATE SEQUENCE s2\G
185+
```
186+
187+
```
188+
*************************** 1. row ***************************
189+
Sequence: s2
190+
Create Sequence: CREATE SEQUENCE `s2` start with 1 minvalue 1 maxvalue 100 increment by 1 cache 1000 nocycle ENGINE=InnoDB
191+
1 row in set (0.00 sec)
192+
```
193+
194+
## MySQL 兼容性
195+
196+
该语句是 TiDB 的扩展,序列的实现借鉴自 MariaDB。
197+
198+
除了 `SETVAL` 函数外,其他函数的“步调 (progressions)” 与 MariaDB 一致。这里的步调是指,序列中的数在定义之后会产生一定的等差关系。`SETVAL` 虽然可以将序列的当前值进行移动设置,但是后续出现的值仍会遵循原有的等差关系。
199+
200+
示例如下:
201+
202+
```
203+
1, 3, 5, ... // 序列遵循起始为 1、步长为 2 的等差关系。
204+
SELECT SETVAL(seq, 6) // 设置序列的当前值为 6。
205+
7, 9, 11, ... // 后续产生值仍会遵循这个等差关系。
206+
```
207+
208+
`CYCLE` 模式下,序列的起始值第一轮为 `START`,后续轮次将会是 `MinValue` (INCREMENT > 0) 或 `MaxValue` (INCREMENT < 0)。
209+
210+
## 另请参阅
211+
212+
* [CREATE SEQUENCE](/sql-statements/sql-statement-create-sequence.md)
213+
* [DROP SEQUENCE](/sql-statements/sql-statement-drop-sequence.md)
214+
* [SHOW CREATE SEQUENCE](/sql-statements/sql-statement-show-create-sequence.md)
215+
* [Sequence Functions](/functions-and-operators/sequence-functions.md)

0 commit comments

Comments
 (0)