PostgreSQL 用户定义数据类型2025年3月17日 | 阅读 7 分钟 在本节中,我们将通过 CREATE DOMAIN 和 CREATE TYPE 命令来理解 PostgreSQL 用户定义数据类型 的工作原理,并看一个 示例。 什么是 PostgreSQL 用户定义数据类型?除了内置的 数据类型,PostgreSQL 还允许我们通过以下命令创建 用户定义数据类型:
现在,让我们看看 CREATE DOMAIN 和 CREATE 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 数据库中。 ![]() 我们在上面的表中使用了 CHECK 限制条件,即 First_name 和 Last_name 列不允许接受 空格和空值。 因此,我们可以创建一个名为 person_name 的域,并在不同列中重复使用它来定义 CHECK 限制条件。 在下面的命令中,我们使用 CREATE DOMAIN 命令来创建一个名为 person_name 的新域,该域使用 VARCHAR 数据类型,并且不允许空格和 NULL 值。 输出 执行上述命令后,我们将看到如下消息窗口,表明 person_name 域 已成功为 Recipients 表创建。 ![]() 创建域后,我们可以将 person_name 域用作 First_name 和 Last_name 列的数据类型,就像一个一致的内置类型一样,如下面的命令所示。 输出 执行上述命令后,我们将看到如下消息窗口,表明 Recipients1 表已成功创建。 ![]() 注意
![]() 在 Recipients1 表成功创建后,我们将使用 INSERT 命令 向其插入一些值。 在下面的命令中,我们正在向 Recipients1 表插入一些值。 输出 在执行上述命令后,PostgreSQL 引发以下错误 new row for relation "recipients" violates check constraint "recipients_check",因为 last_name 列包含空格,如下面的截图所示。 ![]() 为了解决上述错误,我们将提供不带空格的 Last_name,如下面的命令所示。 输出 成功执行上述命令后,我们将看到如下消息窗口,表明该特定值已插入到 Recipients 表中。 ![]() 在 psql 中查看域我们将按照以下步骤在 psql 中查看域: 步骤 1 首先,我们将打开本地系统中的 psql,然后连接到要创建表的数据库。 步骤 2 要连接 Organization 数据库,我们将输入以下命令: 输出 执行上述命令后,我们将获得以下输出 ![]() 步骤 3 现在,我们将输入以下命令来查看 Organization 数据库中的域。 输出 执行上述命令后,我们将看到如下输出,它显示了 Organization 数据库中存在的现有域,即 person_name。 ![]() DROP/ALTER Domain我们可以分别使用 DROP DOMAIN 或 ALTER DOMAIN 命令来删除或修改域。 输出 执行上述命令后,我们将收到以下错误消息:我们无法 drop type person_name because other objects depend on it。 ![]() 因此,在上面的命令中,我们使用 CASCADE,因为它用于自动删除依赖于表的那些对象。 输出 执行上述命令后,我们将看到以下结果,表明 person_name 域已成功删除。 ![]() PostgreSQL CREATE TYPE 命令PostgreSQL CREATE TYPE 命令允许我们创建一个 复合类型,该复合类型可以用作函数的返回类型。 例如:如果我们想要一个函数,它返回多个值:item _id、item_name 和 item_price 步骤 1 首先,我们将 创建一个类型,例如 Item_details, 如下面的命令所示。 输出 执行上述命令后,我们将看到如下消息窗口,显示 item_details 类型 已成功创建。 ![]() 步骤 2 之后,我们将 item_details 数据类型用作函数的返回类型,如下面的命令所示。 输出 执行上述命令后,我们将看到如下消息窗口,显示函数已成功创建。 ![]() 步骤 3 最后,我们将使用 SELECT 命令调用 get_Item_details() 函数。 输出 执行上述命令后,我们将看到以下输出,显示了特定的 ID 商品,即 Audi A7。 ![]() DROP/ALTER TYPE正如我们使用 Drop domain 命令删除域一样,我们可以使用 DROP TYPE 命令 来删除用户定义的数据类型,并可以使用 ALTER TYPE 命令来修改用户定义的数据类型。 输出 在执行上述命令时,我们将收到与上面类似的错误(drop domain),即 we cannot drop type Item_details because other objects depend on it。 ![]() 为了解决上述错误,我们使用 CASCADE,因为它用于自动删除依赖于表的那些对象。 输出 执行上述命令后,我们将看到如下消息窗口,显示指定的类型已成功删除。 ![]() 在 psql 中查看 TYPE如果我们正在使用 psql 程序,我们可以使用以下命令列出当前数据库中的所有用户定义类型。 例如,我们将按照以下步骤在 psql 中查看类型: 步骤 1 首先,我们将打开本地系统中的 psql,然后连接到要创建表的数据库。 步骤 2 要连接 Organization 数据库,我们将输入以下命令: ![]() 步骤 3 现在,我们将输入以下命令来查看 Organization 数据库中的域。 输出 执行上述命令后,我们将看到如下输出,它显示了 Organization 数据库中存在的现有 TYPE,即 Item_details。 ![]() 输出 执行上述命令后,我们将看到如下输出,它显示了 Organization 数据库中存在的现有 TYPE,即 Item_details。 ![]() 概述在 PostgreSQL 用户定义数据类型 部分,我们学习了以下最常用的操作:
|
我们请求您订阅我们的新闻通讯以获取最新更新。