Lazy loaded image
10_序列管理
Words 3541Read Time 9 min
2025-12-11

序列管理

1. 序列的基本概念

1.1 什么是序列

序列(Sequence)是数据库中用于生成唯一数字的对象,通常用于生成表的主键值或其他需要唯一标识符的列值。序列是一个独立的数据库对象,不依赖于任何表,但可以被表的列引用。

1.2 序列的作用

序列的主要作用包括: - 生成唯一标识符:用于生成表的主键值,确保每条记录都有唯一的标识符 - 自动递增:可以自动生成递增的数字,无需手动指定 - 批量生成:可以一次性生成多个连续的数字 - 独立性:序列是独立的数据库对象,可以被多个表共享 - 可控性:可以控制序列的起始值、增量、最大值、最小值等

1.3 序列的特点

  • 序列是独立的数据库对象,不依赖于任何表
  • 序列的值是唯一的,不会重复
  • 序列的值是连续的,可以按指定的增量递增或递减
  • 序列的值可以循环使用(如果设置了循环选项)
  • 序列的值可以缓存,提高性能

2. 序列的创建

2.1 创建序列的语法

参数说明: - IF NOT EXISTS:如果序列已存在,不报错 - sequence_name:序列名 - INCREMENT [ BY ] increment:序列的增量,正数表示递增,负数表示递减,默认为1 - MINVALUE minvalue | NO MINVALUE:序列的最小值,默认为1(递增序列)或-2^63+1(递减序列) - MAXVALUE maxvalue | NO MAXVALUE:序列的最大值,默认为2^63-1(递增序列)或-1(递减序列) - START [ WITH ] start:序列的起始值,默认为最小值(递增序列)或最大值(递减序列) - CACHE cache:序列的缓存大小,默认为20 - [ NO ] CYCLE:是否循环使用序列值,默认为NO CYCLE - OWNED BY { table_name.column_name | NONE }:序列所属的表和列,默认为NONE - TABLESPACE tablespace_name:序列所在的表空间,默认为默认表空间

2.2 创建序列的示例

2.2.1 创建基本序列

2.2.2 创建带有最小值和最大值的序列

2.2.3 创建带有缓存和循环选项的序列

2.2.4 创建与表关联的序列

3. 序列的使用

3.1 序列的基本使用

序列的使用主要包括获取序列的下一个值和当前值。

3.1.1 获取序列的下一个值

使用nextval()函数获取序列的下一个值:
示例:

3.1.2 获取序列的当前值

使用currval()函数获取序列的当前值,需要先调用nextval()函数:
示例:

3.1.3 获取序列的起始值

使用setval()函数可以设置序列的当前值:
参数说明: - sequence_name:序列名 - value:要设置的序列值 - is_called:如果为TRUE,下次调用nextval()将返回value+increment;如果为FALSE,下次调用nextval()将返回value
示例:

3.2 在INSERT语句中使用序列

序列常用于生成表的主键值,可以在INSERT语句中直接使用nextval()函数:

3.2.1 基本用法

3.2.2 作为默认值使用

可以将序列的nextval()函数设置为列的默认值,这样在插入数据时无需手动指定该列的值:

3.3 批量生成序列值

可以使用generate_series()函数批量生成序列值:

4. 序列的修改

4.1 修改序列的语法

4.2 修改序列的示例

4.2.1 修改序列的增量

4.2.2 修改序列的最小值和最大值

4.2.3 修改序列的缓存大小

4.2.4 修改序列的循环选项

4.2.5 重命名序列

4.2.6 修改序列所属的表和列

5. 序列的删除

5.1 删除序列的语法

参数说明: - IF EXISTS:如果序列不存在,不报错 - sequence_name:序列名 - CASCADE:级联删除依赖该序列的对象 - RESTRICT:如果有对象依赖该序列,拒绝删除

5.2 删除序列的示例

6. 序列的查看

6.1 使用gsql命令查看序列

使用\ds\ds+命令查看序列列表和详细信息:

6.2 使用SQL查询查看序列

可以通过查询系统视图pg_sequencespg_sequence查看序列的详细信息:

7. 序列的最佳实践

7.1 序列的命名规范

  • 使用有意义的序列名,如使用seq_前缀加上表名和列名,如seq_employee_id
  • 统一命名风格,如使用下划线分隔单词(snake_case)
  • 避免使用保留字

7.2 序列的设计原则

  • 为每个需要唯一标识符的表创建独立的序列
  • 合理设置序列的起始值,如从1开始递增
  • 根据实际需求设置序列的增量,如1或10
  • 合理设置序列的缓存大小,平衡性能和内存使用
  • 对于不需要循环的序列,使用NO CYCLE选项
  • 对于重要的序列,设置MAXVALUE限制,避免序列值过大

7.3 序列的性能优化

  • 适当设置缓存大小,提高性能。缓存大小越大,性能越好,但会增加内存使用
  • 对于频繁插入数据的表,使用较大的缓存大小
  • 对于不频繁插入数据的表,使用较小的缓存大小或不使用缓存
  • 避免在事务中频繁调用nextval(),减少锁竞争

7.4 序列的安全性

  • 限制序列的访问权限,只允许必要的用户访问
  • 避免直接修改序列的值,除非必要
  • 定期监控序列的使用情况,确保序列值不会耗尽

7.5 序列与主键的关系

  • 序列常用于生成表的主键值,确保主键的唯一性
  • 主键可以是单一列,也可以是复合列
  • 对于复合主键,可以为其中的一列使用序列,另一列使用其他值

8. 示例:综合使用序列

8.1 创建表和序列

8.2 使用序列插入数据

8.3 查询数据

8.4 修改序列

8.5 管理序列

9. 序列与自增列的比较

在一些数据库系统中,支持自增列(如MySQL的AUTO_INCREMENT),而openGauss使用序列来实现类似的功能。序列与自增列的主要区别包括:
特性
序列
自增列
独立性
独立的数据库对象,可以被多个表共享
依赖于表的列,每个自增列只能属于一个表
灵活性
可以控制起始值、增量、最大值、最小值等
只能控制起始值和增量
共享性
可以被多个表共享
不能被多个表共享
可控性
可以手动设置序列值
不能手动设置自增列值
缓存
支持缓存,提高性能
不支持缓存
循环
支持循环使用
不支持循环使用

10. 小结

本章节介绍了openGauss数据库的序列管理,包括序列的基本概念、创建、修改、删除、使用等内容。通过本章节的学习,读者可以掌握openGauss数据库序列的全面管理方法,能够根据实际需求创建和管理序列,生成唯一的数字标识符。
序列是数据库中用于生成唯一数字的重要对象,常用于生成表的主键值,确保每条记录都有唯一的标识符。数据库管理员和开发人员需要熟练掌握序列的管理技能,根据实际业务需求合理设计和使用序列,确保数据库的性能和数据完整性。在实际工作中,应遵循序列的命名规范、设计原则、性能优化和安全性等最佳实践,合理使用序列的各种选项,提高数据库的性能和可管理性。
上一篇
openGauss数据库
下一篇
openGauss数据库