PostgreSQL 用户定义数据类型

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

在本节中,我们将通过 CREATE DOMAIN 和 CREATE TYPE 命令来理解 PostgreSQL 用户定义数据类型 的工作原理,并看一个 示例

什么是 PostgreSQL 用户定义数据类型?

除了内置的 数据类型PostgreSQL 还允许我们通过以下命令创建 用户定义数据类型

命令描述
CREATE DOMAIN它创建一个带有限制条件的用户定义数据类型,例如 CHECK、NOT NULL 等。
CREATE TYPECREATE TYPE 命令用于创建一个复合类型,该类型在 存储过程 中用于返回值的数​​据类型。

现在,让我们看看 CREATE DOMAINCREATE TYPE 命令如何用于 PostgreSQL 用户定义数据。

PostgreSQL CREATE DOMAIN 命令

在 PostgreSQL 中,域在模式范围内具有唯一名称,因为 是一种数据类型,具有 可选的限制条件,如 CHECK、NOT NULL。为了整合具有共同限制条件的字段的组织,域总是很有益的。

例如,假设我们有一些包含相似列的表,这些列不允许 NULL 和空格。

换句话说,我们可以说一些表可能包含文本列,需要 CHECK 限制条件来确保值不为 null 且不包含空格。

域数据类型示例

让我们看一个示例,以了解 域数据类型 的工作原理。

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

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

Recipients 表包含以下列:Recipient_id、First_name、Last_name 和 Email。

输出

执行上述命令后,我们将收到以下消息,表明 Recipients 表已成功创建在 Organization 数据库中。

PostgreSQL User-Defined data type

我们在上面的表中使用了 CHECK 限制条件,即 First_nameLast_name 列不允许接受 空格和空值。

因此,我们可以创建一个名为 person_name 的域,并在不同列中重复使用它来定义 CHECK 限制条件。

在下面的命令中,我们使用 CREATE DOMAIN 命令来创建一个名为 person_name 的新域,该域使用 VARCHAR 数据类型,并且不允许空格和 NULL 值。

输出

执行上述命令后,我们将看到如下消息窗口,表明 person_name 域 已成功为 Recipients 表创建。

PostgreSQL User-Defined data type

创建域后,我们可以将 person_name 域用作 First_nameLast_name 列的数据类型,就像一个一致的内置类型一样,如下面的命令所示。

输出

执行上述命令后,我们将看到如下消息窗口,表明 Recipients1 表已成功创建。

PostgreSQL User-Defined data type

注意

  • 请注意,创建域后,两个表名称必须不同,因为它们会采用与域相同的表名(Recipients)。
  • PostgreSQL 会引发以下错误 relation "recipients" already exists, 如下面的截图所示。
PostgreSQL User-Defined data type

Recipients1 表成功创建后,我们将使用 INSERT 命令 向其插入一些值。

在下面的命令中,我们正在向 Recipients1 表插入一些值。

输出

在执行上述命令后,PostgreSQL 引发以下错误 new row for relation "recipients" violates check constraint "recipients_check",因为 last_name 列包含空格,如下面的截图所示。

PostgreSQL User-Defined data type

为了解决上述错误,我们将提供不带空格的 Last_name,如下面的命令所示。

输出

成功执行上述命令后,我们将看到如下消息窗口,表明该特定值已插入到 Recipients 表中。

PostgreSQL User-Defined data type

在 psql 中查看域

我们将按照以下步骤在 psql 中查看域:

步骤 1

首先,我们将打开本地系统中的 psql,然后连接到要创建表的数据库。

步骤 2

要连接 Organization 数据库,我们将输入以下命令:

输出

执行上述命令后,我们将获得以下输出

PostgreSQL User-Defined data type

步骤 3

现在,我们将输入以下命令来查看 Organization 数据库中的域。

输出

执行上述命令后,我们将看到如下输出,它显示了 Organization 数据库中存在的现有域,即 person_name

PostgreSQL User-Defined data type

DROP/ALTER Domain

我们可以分别使用 DROP DOMAIN 或 ALTER DOMAIN 命令来删除或修改域。

输出

执行上述命令后,我们将收到以下错误消息:我们无法 drop type person_name because other objects depend on it。

PostgreSQL User-Defined data type

因此,在上面的命令中,我们使用 CASCADE,因为它用于自动删除依赖于表的那些对象。

输出

执行上述命令后,我们将看到以下结果,表明 person_name 域已成功删除。

PostgreSQL User-Defined data type

PostgreSQL CREATE TYPE 命令

PostgreSQL CREATE TYPE 命令允许我们创建一个 复合类型,该复合类型可以用作函数的返回类型。

例如:如果我们想要一个函数,它返回多个值:item _id、item_name 和 item_price

步骤 1

首先,我们将 创建一个类型,例如 Item_details, 如下面的命令所示。

输出

执行上述命令后,我们将看到如下消息窗口,显示 item_details 类型 已成功创建。

PostgreSQL User-Defined data type

步骤 2

之后,我们将 item_details 数据类型用作函数的返回类型,如下面的命令所示。

输出

执行上述命令后,我们将看到如下消息窗口,显示函数已成功创建。

PostgreSQL User-Defined data type

步骤 3

最后,我们将使用 SELECT 命令调用 get_Item_details() 函数。

输出

执行上述命令后,我们将看到以下输出,显示了特定的 ID 商品,即 Audi A7

PostgreSQL User-Defined data type

DROP/ALTER TYPE

正如我们使用 Drop domain 命令删除域一样,我们可以使用 DROP TYPE 命令 来删除用户定义的数据类型,并可以使用 ALTER TYPE 命令来修改用户定义的数据类型。

输出

在执行上述命令时,我们将收到与上面类似的错误(drop domain),即 we cannot drop type Item_details because other objects depend on it。

PostgreSQL User-Defined data type

为了解决上述错误,我们使用 CASCADE,因为它用于自动删除依赖于表的那些对象。

输出

执行上述命令后,我们将看到如下消息窗口,显示指定的类型已成功删除。

PostgreSQL User-Defined data type

在 psql 中查看 TYPE

如果我们正在使用 psql 程序,我们可以使用以下命令列出当前数据库中的所有用户定义类型。

例如,我们将按照以下步骤在 psql 中查看类型:

步骤 1

首先,我们将打开本地系统中的 psql,然后连接到要创建表的数据库。

步骤 2

要连接 Organization 数据库,我们将输入以下命令:


PostgreSQL User-Defined data type

步骤 3

现在,我们将输入以下命令来查看 Organization 数据库中的域。

输出

执行上述命令后,我们将看到如下输出,它显示了 Organization 数据库中存在的现有 TYPE,即 Item_details

PostgreSQL User-Defined data type

输出

执行上述命令后,我们将看到如下输出,它显示了 Organization 数据库中存在的现有 TYPE,即 Item_details

PostgreSQL User-Defined data type

概述

PostgreSQL 用户定义数据类型 部分,我们学习了以下最常用的操作:

  • PostgreSQL 用户定义数据 类型用于通过 Create DOMAIN 和 CREATE TYPE 来创建 用户定义数据类型
  • CREATE DOMAIN 命令用于创建带有限制条件的用户定义数据类型,如 CHECK、NOT NULL 等。
  • CREATE TYPE 命令用于创建复合类型,该复合类型在 存储过程 中用于返回值的数​​据类型。
  • 要在 PSQL 中查看新创建的 DOMAIN,我们使用了 \dD
  • 我们使用 \dT 或 \dT+ 命令在 PSQL 中查看新生成的 TYPE。
  • 我们使用了 DROP DOMAIN 命令 来删除用户定义的数据类型,并可以使用 ALTER DOMAIN 命令来修改用户定义的数据类型。
  • 我们还使用了 DROP TYPE 或 ALTER TYPE 命令来删除用户定义类型。

下一主题PostgreSQL Schema