PostgreSQL Serial

17 Mar 2025 | 5 分钟阅读

在本节中,我们将了解 PostgreSQL Serial 伪类型的工作原理,它允许我们在表中定义 自动增量列。我们还将了解 PostgreSQL Serial 伪类型示例

什么是 PostgreSQL Serial 伪类型?

PostgreSQL 中,我们有一种特殊的数据库对象生成器,称为 Serial,用于创建整数序列,该序列通常用作表中的主键

在创建新表时,我们可以使用 SERIAL 伪类型 来生成序列,如下面的命令所示:

如果我们将 SERIAL 伪类型 提供给 ID 列,PostgreSQL 将执行以下操作:

  • 首先,PostgreSQL 会创建一个序列对象,然后将序列生成的下一个值设置为该特定列的预定义值。
  • 然后,PostgreSQL 将为 ID 列 添加一个 NOT NULL 约束,因为序列总是生成一个非空值的整数。
  • 最后,PostgreSQL 将将序列的所有者指定给 ID 列;作为结果,当表或 ID 列 被删除时,序列对象也会被删除。

注意:我们可以使用这两种命令来指定 Serial 伪类型,因为以下两种命令是相似的。


PostgreSQL Serial 伪类型 分为三种类型,如下所示:

  • SMALLSERIAL
  • SERIAL
  • BIGSERIAL

下表包含 PostgreSQL 支持的所有 Serial 伪类型 规范:

名称存储大小范围
SMALLSERIAL2 字节1 到 32767
SERIAL4 字节1 到 2147483647
BIGSERIAL8 字节1 到 9223372036854775807

PostgreSQL Serial 伪类型语法

PostgreSQL Serial 伪类型 的语法如下:

PostgreSQL SERIAL 类型示例

让我们通过不同示例来了解 PostgreSQL Serial 伪类型 的工作原理。

注意:我们可以为 SERIAL 列定义 PRIMARY KEY 约束,因为 SERIAL 类型不会间接为列创建索引或将列设为主键列。

我们将使用 CREATE 命令创建一个新表,并使用 INSERT 命令插入一些值。

在下面的示例中,我们使用 CREATE 命令在 Organization 数据库 中创建一个 Cars 表:

输出

执行上述命令后,Cars 表已成功创建,如下图所示:

PostgreSQL Serial

一旦 Cars 表生成,我们就可以使用 INSERT 命令向其中插入一些值。我们可以在 INSERT 命令中使用 DEFAULT 关键字,或者省略列名 (Car_id)

输出

执行上述命令后,我们将收到以下消息,表示值已成功插入到 Cars 表中:

PostgreSQL Serial

使用带列名 (Car_id)DEFAULT 关键字

输出

执行上述命令后,我们将收到以下消息;值已成功插入到 Cars 表中:

PostgreSQL Serial

从上图可以看出,PostgreSQL 在 Cars 表中插入了两行,Car_id 列的值分别为 1 和 2

在创建并插入 Cars 表的值后,我们将使用 SELECT 命令返回 Cars 表的所有行。

输出

成功执行上述命令后,我们将得到以下结果:

PostgreSQL Serial

我们可以使用 pg_get_serial_sequence() 函数来获取指定表中 SERIAL 列的序列名称,如下面的语法所示:

要获取序列生成的当前值,我们可以将序列名称传递给 currval() 函数。

在下面的示例中,我们使用 currval() 函数返回 CarsCar_id_seq 对象生成的当前值:

输出

在实现上述命令后,我们将获得以下输出

PostgreSQL Serial

如果我们想在插入新行时获取序列生成的值,可以在 INSERT 命令中使用 RETURNING Car_id 子句。

下面的命令用于向 Cars 表插入一行新数据,并返回为 Car_id 列生成的数据。

输出

执行上述命令后,我们将得到以下输出,它返回 Car_id3

PostgreSQL Serial

注意

  • 正如我们上面所理解的,序列生成器操作不是事务安全的,这意味着如果两个并发数据库连接尝试从序列获取下一个值,每个用户将获得不同的值。
  • 如果一个用户回滚事务,该用户的序列号将处于空闲状态,并在序列中创建间隙。

示例 2

让我们再看一个例子来详细了解 Serial 伪类型

因此,我们将使用 CREATE 命令在与 Organization 相同的数据库中创建一个名为 Vegetables 的新表,并将 Veg_id 列设置为 SERIAL 伪类型。

输出

执行上述命令后,Vegetables 表已成功创建,如下图所示:

PostgreSQL Serial

一旦 Vegetables 表生成,我们将使用 INSERT 命令向其中插入一些值,并忽略 Veggies_id 列,如下面的命令所示:

输出

执行上述命令后,我们将收到以下消息:值已成功插入到 Vegetables 表中。

PostgreSQL Serial

或者,我们也可以使用 Default 关键字,并使用 Veggie_id 列,如下面的命令所示:

输出

执行上述命令后,我们将得到以下消息,它说明我们可以使用 Default 关键字忽略列名,结果会相似:

PostgreSQL Serial

因此,我们将使用以下命令向 Cars 表添加更多值:

输出

执行上述命令后,我们将得到以下消息,显示值已成功插入到 Vegetables 表中。

PostgreSQL Serial

在创建并插入 Vegetables 表的值后,我们将使用 SELECT 命令返回 Vegetables 表的所有行。

输出

成功执行上述命令后,我们将得到以下输出:

PostgreSQL Serial

概述

PostgreSQL Serial 伪类型 部分,我们学习了 Serial 伪类型功能,它主要用于为特定表创建自动增加的列值。


下一个主题PostgreSQL 日期