PostgreSQL 序列

2025年3月17日 | 阅读 8 分钟

在本节中,我们将理解 PostgreSQL 序列的工作原理、PostgreSQL 序列的示例,并了解序列对象如何用于创建数字序列,以及查看 nextval() 函数的示例。

我们还将通过 CREATE SEQUENCE 命令查看创建升序和降序序列的示例,并通过 DROP SEQUENCE 命令删除序列。

什么是 PostgreSQL 序列?

序列是用于创建渐进式数字的生成器,它可以帮助自动生成单个主键,并同步跨不同行或表的键。

PostgreSQL 中,序列是用户定义的模式绑定对象,它根据特定需求创建整数序列。

在 PostgreSQL 序列中,数字的顺序很重要。例如,{5,6,7,8,9,10} 和 {10,9,8,7,6,5} 是完全不同的序列。

我们使用 CREATE SEQUENCE 命令在 PostgreSQL 中生成序列。

PostgreSQL CREATE SEQUENCE 命令

  • PostgreSQL CREATE SEQUENCE 命令用于生成一个原始序列号生成器,它还包括生成和设置一个名为新不同单行表。
  • 生成器将由发出语句的用户维护。
  • PostgreSQL 序列基于bigint 算术构建;因此,范围-9223372036854775808 到 9223372036854775807。我们无法超出八字节的范围。
  • 在 PostgreSQL 中,序列名称必须与同一模式中的任何其他序列、表、视图、索引或外部表不同。
  • 序列在一个特定的模式中创建,如果之前给出了模式名称,则在现有模式中生成。
  • 生成序列后,我们可以使用 currval、setval 和 nextval 函数来操作序列。
  • 生成临时序列时不能指定模式名称,因为临时序列出现在特殊模式中。

PostgreSQL Create Sequence 命令语法

PostgreSQL Create Sequence 的语法如下:

在上面的语法中,我们使用了以下参数:

参数描述
sequence_name
  • sequence_name 与同一模式中的任何其他序列、索引、表、视图或外部表都不同。
  • 我们可以在 CREATE SEQUENCE 之后定义序列名称。
  • 并且 IF NOT EXISTS 条件仅在序列不存在时才创建新序列。
[ AS { SMALLINT | INT | BIGINT } ]
  • 序列的数据类型,它决定了序列的最大值和最小值。
  • 我们可以定义序列的数据类型,支持的数据类型为 INT、BIGINT 和 SMALLINT。
  • 如果我们忘记指定数据类型,它将默认为 BIGINT,因为它是序列的默认数据类型。
[ INCREMENT [ BY ] increment ]
  • increment 描述了要加到现有序列值以生成新值的值,默认值为 1。
  • 这里,正数 (+) 将生成升序序列,而负数 (-) 将生成降序序列
[ MINVALUE minvalue | NO MINVALUE ]
[ MAXVALUE maxvalue | NO MAXVALUE ]
  • 如果使用 NO MINVALUE 和 NO MAXVALUE,序列将采用默认值。
  • 对于升序序列,最大默认值为序列数据类型的最大值最小默认值为 1
  • 对于降序序列,最大默认值为-1最小默认值为序列数据类型的最小值
[ START [ WITH ] start ]
  • START 子句用于定义序列的起始值。
  • 对于降序序列,默认初始值为最大值,对于升序序列,默认初始值为最小值
cache
  • 一次只能创建一个值,并且默认情况下,序列一次创建一个值,即无缓存
  • CACHE 参数用于指定预先分配并存储在内存中以便更快访问的序列号总数
CYCLE | NO CYCLE
  • CYCLE 参数允许我们在达到限制时恢复值。对于降序序列下一个数字将是最大值;对于升序序列下一个数字将是最小值
  • 如果我们使用 NO CYCLE,当达到限制或尝试获取下一个值时,它将引发错误。
  • 如果我们不定义 CYCLE 或 NO CYCLE,则NO CYCLE 是默认选项。
OWNED BY table_name.column_name
  • 最后,OWNED BY 参数用于将表列与序列关联。
  • 因此,如果我们删除表或列,PostgreSQL 将自动删除相关的序列。

注意:当我们在表列中使用 SERIAL 伪类型时,PostgreSQL 会在后台自动生成一个与该列相关的序列。

PostgreSQL Create Sequence 示例

让我们看一些不同的示例来理解 PostgreSQL CREATE SEQUENCE 的工作原理。

  • 生成升序序列的示例

在下面的示例中,使用以下命令 CREATE SEQUENCE 为生成一个新的升序序列,该序列从 20 开始增量为 3

输出

执行上述命令后,我们将看到以下消息窗口,显示升序序列已成功创建。

PostgreSQL Sequence

在这里,我们还可以使用 nextval() 函数来获取序列的下一个值。

输出

实现上述命令后,我们将看到以下输出,显示序列的下一个值。

PostgreSQL Sequence

如果我们再次执行上述命令,我们将获得序列的下一个值。

输出

执行上述命令后,我们将看到以下输出,显示序列的下一个值。

PostgreSQL Sequence
  • 生成降序序列的示例

在下面的示例中,使用以下命令为从 5 到 1 的降序序列生成,并带有循环选项。

输出

执行上述命令后,我们将看到以下消息,显示降序序列已成功创建到 Organization 数据库中。

PostgreSQL Sequence

当我们多次执行下面的命令时,我们将看到数字从5,4,3,2,1 然后回到 5,4,3,2,1 依此类推。

输出

执行上述命令后,我们将看到以下输出,以降序显示序列中的值。

PostgreSQL Sequence
  • 创建与表列相关的序列

让我们看一个示例,了解如何创建与表列相关的序列。

步骤 1:创建新表

首先,我们使用 CREATE 命令创建一个名为 Purchase_details 的新表,并使用 INSERT 命令插入一些值。

为了在 Organization 数据库中创建 Purchase_details,我们使用 CREATE 命令。

Purchase_details 表包含各种列,如 Purchase_id、Module_id、Module_text 和 Cost,其中 Purchase_id 和 Module_id 列是主键列。

输出

执行上述命令后,我们将看到以下消息,显示 Purchase_details 表已成功创建到 Organization 数据库中。

PostgreSQL Sequence

步骤 2:创建新序列

成功创建 Purchase_details 表后,我们将使用 CREATE SEQUENCE 命令创建一个与 Purchase_details 表的 Module_id 列相关联的新序列,如下面的命令所示。

输出

执行上述命令后,新序列已成功创建。

PostgreSQL Sequence

步骤 3:插入数据

成功创建 Purchase_details 表和 Purchase_module_id 序列后,我们将使用 INSERT 命令将一些值插入 Purchase_details 表。

下面的命令用于将各种采购行模块插入 Purchase_details 表。

输出

实现上述命令后,我们将看到以下消息窗口,显示三个值已成功插入 Purchase_details 表中。

PostgreSQL Sequence

注意:在上面的命令中,我们使用了 nextval() 函数来检索 Purchase_module_id 序列的 Module_id 值。

步骤 4:检索数据

创建并插入 Purchase_details 表的值后,我们将使用 SELECT 命令Purchase_details 表中检索数据。

输出

成功实现上述命令后,我们将看到以下结果,显示 PostgreSQL 返回 Purchase_details 表中存在的数据。

PostgreSQL Sequence
  • 列出数据库中的所有序列

在下面的命令中,我们将列出当前数据库中存在的所有序列。

输出

实现上述命令后,我们将看到以下结果,显示 Organization 数据库中所有序列的列表。

PostgreSQL Sequence
  • 移除序列

如果序列与表列关联,一旦删除表或删除表的列,它将自动移除。

我们可以手动使用 DROP SEQUENCE 命令来删除序列。

移除 PostgreSQL 序列的语法

移除 PostgreSQL 序列的语法如下:

在上面的语法中,我们使用了以下参数

参数描述
Sequence_name
  • 它用于定义我们要删除的序列的名称。
If EXISTS
  • 如果需要一次删除多个序列,我们可以使用逗号分隔的序列名称列表
  • 并且 IF EXISTS 参数会在序列存在时才删除它。
CASCADE
  • 如果我们要递归删除基于序列的对象,可以使用 CASCADE 选项。

PostgreSQL DROP SEQUENCE 命令示例

为了删除 Purchase_details 表,我们使用了 DROP TABLE 命令;同时,序列 Purchase_module_idPurchase_detailsModule_id 相关联。

因此,它也会被递归删除,如下面的命令所示。

输出

执行上述命令后,我们将看到以下消息窗口,显示 Purchase_details 已成功移除。

PostgreSQL Sequence

概述

PostgreSQL 序列部分,我们学习了以下主题:

  • PostgreSQL 序列用作序列对象来创建序列列表。
  • 我们使用 CREATE SEQUENCE 命令创建新的序列号
  • 在本节中,我们还了解了如何使用 CREATE SEQUENCE 创建升序降序序列
  • 我们使用 nextval() 函数检索序列的下一个值
  • 我们还看到了使用 DROP SEQUENCE / DROP TABLE 删除序列的示例。