|
| 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