Oracle兼容-语法-SEQUENCE(序列)


序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,但占用内存。

通常用于生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。

GreatSQL的 SEQUENCE 语法与Oracle完全兼容,只有部分特性在实现上略有差异。

1. 语法

1. CREATE SEQUENCE schema_name.sequence_name
2. [INCREMENT BY interval]
3. [START WITH first_number]
4. [MAXVALUE max_value | NOMAXVALUE]
5. [MINVALUE min_value | NOMINVALUE]
6. [CYCLE | NOCYCLE]
7. [CACHE cache_size | NOCACHE]
8. [ORDER | NOORDER];

2. 定义和用法

2.1 创建 SEQUENCE 相关参数说明

创建 SEQUENCE 相关参数默认值如下表所示:

属性名 默认值 描述
START WITH 1 起始值
INCREMENT BY 1 获取下个值的步长(可为负数)
MINVALUE 1 最小值
MAXALUE 10^29-1 28位十进制值
CYCLE false 当为true时,使用完所有值后重新循环获取
CACHE 20 高速缓存中为当前序列储存的值的数量
ORDER false 当为true时,保证全局有序(会损失性能)

关于使用 SEQUENCE 有几点要注意:

    1. 确保高速访问 SEQUENCE

SEQUENCE 使用内存高速缓存用于快速访问并获取 NEXTVAL,同时使用物理表持久化当前值(高速缓存中缓存 SEQUENCE 值的个数和选项 CACHE 指定的个数有关)。

参数 ORDER 通常用于多实例场景中(例如MGR多写场景)获取 SEQUENCE 值时全局保证有序性,当指定 ORDER 为 true 时,高速缓存失效,性能会受到一定程度损失。

提醒:当 ORDER 为 true,或 CACHE 参数值较小时,会降低序列取值性能。

    1. 序列值预分配及确保全局唯一

高速缓存中的序列值采用 预分配机制。当高速缓存值用尽时,则读取当前序列在物理表中的记录,并依据此记录再次分配20个(默认)序列值,并更新物理表。更新成功后这20个序列值预分配成功,保存在高速缓存中。

若GreatSQL实例被关闭或异常崩溃,缓存中的未使用完的值会丢失,重启实例后再次获取的序列值不包含上次预分配的序列值。

    1. 其他注意事项
    1. 不建议用于MGR多主写场景。
    1. 为提高性能,序列对象需要占用内部连接,在序列对象较多时需要适当调大最大连接数。

2.2 使用 SEQUENCE

    1. 创建/删除/修改

GreatSQL支持的SEQUENCE操作有 CREATE、DROP、ALTER,暂未支持 RENAME。

执行 ALTER SEQUENCE 修改时,不支持修改 START WITH 值。

执行 DROP SEQUENCE 删除序列时只支持每次删除一个序列。

对 SEQUENCE 执行上述DDL操作时,会对 SEQUENCE 加MDL锁保护,因此无需考虑DDL和DML同时操作同一序列会产生冲突。

SEQUENCE 对象名与表名、视图名互斥。同一个 SCHEMA 下无法创建同名的序列、表、视图。

    1. 查看

可通过 SHOW CREATE SEQUENCE seq_name 语句展示 SEQUENCE 创建的DDL。

还可通过SHOW [FULL] SEQUENCES [FROM|IN schema_name] [LIKE seq_name] [WHERE where_condition] 展示指定schema中的所有序列。

    1. 导出备份

在使用 mysqldump 导出数据时,可通过增加 --sequences 选项(默认为关闭),导出序列对象。导出时,序列的 START WITH 是下一个有效值。

注意:--sequences 选项不能与 --xml 选项同时使用。

示例:

1. mysqldump -S/data/GreatSQL/mysql.sock -uroot -pxxx -B greatsql -d --sequences > /data/backup/GreatSQL/greatsql-ddl.sql

3. 示例

1. -- 创建
2. greatsql> CREATE SEQUENCE `seq1`
3. START WITH 1
4. MINVALUE 1
5. MAXVALUE 9999999999999999999999999999
6. INCREMENT BY 1
7. NOCYCLE CACHE 20 NOORDER;

9. -- 查看
10. greatsql> SHOW SEQUENCES;
11. +-----------------------+
12. | Sequences_in_greatsql |
13. +-----------------------+
14. | seq1                  |
15. +-----------------------+

17. greatsql> SHOW FULL SEQUENCES;
18. +-----------------------+------------+----------+------------------------------+--------------+-------+-------+-------+
19. | Sequences_in_greatsql | Start_with | Minvalue | Maxvalue                     | Increment_by | Cycle | Cache | Order |
20. +-----------------------+------------+----------+------------------------------+--------------+-------+-------+-------+
21. | seq1                  |          1 |        1 | 9999999999999999999999999999 |            1 |     0 |    20 |     0 |
22. +-----------------------+------------+----------+------------------------------+--------------+-------+-------+-------+

24. greatsql> SHOW CREATE SEQUENCE SEQ1;
25. +----------+------------------------------------------------------------------------------------------------------------------------------+
26. | Sequence | Create Sequence                                                                                                              |
27. +----------+------------------------------------------------------------------------------------------------------------------------------+
28. | seq1     | CREATE SEQUENCE `seq1` START WITH 1 MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 NOCYCLE CACHE 20 NOORDER |
29. +----------+------------------------------------------------------------------------------------------------------------------------------+

31. -- 修改
32. greatsql> ALTER SEQUENCE seq1 MAXVALUE 99999;

34. -- 修改最小值失败,因为当前值比最小值还小(要求 MINVALUE <= currval <= MAXVALUE)
35. greatsql> ALTER SEQUENCE seq1 MINVALUE 3;
36. ERROR 8586 (HY000): alter sequence failed, cause "currval" should between MINVALUE and MAXVALUE!

38. -- 执行下面操作,反复取值,直到 currval >= MINVALUE
39. greatsql> SELECT seq1.NEXTVAL;
40. +---------+
41. | nextval |
42. +---------+
43. |       1 |
44. +---------+
45. ...
46. +---------+
47. | nextval |
48. +---------+
49. |      15 |
50. +---------+

52. -- 再次修改
53. greatsql> ALTER SEQUENCE seq1 MINVALUE 10;
54. Query OK, 1 row affected (0.00 sec)

56. -- 不能修改START WITH
57. greatsql> alter sequence seq1 start with 10;
58. ERROR 8586 (HY000): alter sequence failed, cause can not modify START WITH

60. -- 删除
61. greatsql> DROP SEQUENCE seq1;
62. Query OK, 1 row affected (0.00 sec)

4. SEQUENCE 数据字典

1. -- 1. 查询 information_schema.SEQUENCES 查看所有SEQUENCE
2. greatsql> SELECT * FROM information_schema.SEQUENCES;
3. +----------+------+------------+----------+------------------------------+-----------+------------+-----------+------------+
4. | DB       | NAME | START_WITH | MINVALUE | MAXVALUE                     | INCREMENT | CYCLE_FLAG | CACHE_NUM | ORDER_FLAG |
5. +----------+------+------------+----------+------------------------------+-----------+------------+-----------+------------+
6. | greatsql | seq1 |          1 |        1 | 9999999999999999999999999999 |         1 |          0 |        20 |          0 |
7. +----------+------+------------+----------+------------------------------+-----------+------------+-----------+------------+
8. 1 row in set (0.00 sec)

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx