PostgreSQL 用户定义的数据类型


PostgreSQL 用户定义的数据类型

在本节中,我们将在CREATE DOMAIN 和 CREATE TYPE命令的帮助下了解PostgreSQL 用户定义数据类型的工作,并查看它的示例

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

除了内置数据类型,PostgreSQL还为我们提供了在以下命令的帮助下生成用户定义的数据类型

命令 描述
CREATE DOMAIN 它生成带有约束的用户定义数据类型,例如,CHECK、NOT NULL 等。
CREATE TYPE create type 命令用于生成复合类型,根据返回值的数据类型在存储过程中使用。

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

PostgreSQL CREATE DOMAIN 命令

在 PostgreSQL 中,域在模式范围内具有唯一名称,因为是具有选择性约束(例如CHECK、NOT NULL)的数据类型。为了巩固具有共同约束的字段的组织,域总是有益的。

例如,假设我们有一些包含类似列的表,该列不接受 NULL 和空格。

换句话说,我们可以说某些表可能包含文本列,这些列需要一个 CHECK 约束来确保值不为空并保持用空格扩展。

域数据类型示例

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

我们正在使用 CREATE 命令的帮助创建一个作为收件人的\新表,并使用 INSERT 命令插入一些值。

要将收件人\创建到组织数据库中,我们使用CREATE命令。

收件人\表包含以下几列,如Recipient_id,名字,姓氏和电子邮件。

CREATE TABLE Recipients (  
Recipient_ID SERIAL PRIMARY KEY,  
    First_name VARCHAR NOT NULL,  
    Last_name VARCHAR NOT NULL,  
    Email VARCHAR NOT NULL,  
    CHECK (  
      First_name !~ '\s'  
      AND Last_name !~ '\s'  
    )  
);

输出

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

PostgreSQL 用户定义的数据类型

我们在上表中使用了CHECK 约束,即First_nameLast_name列不接收空格和空值。

因此,在这里我们可以创建 as person_name域并在各个列中重用它来定义 CHECK 约束。

在下面的命令中,我们使用CREATE DOMAIN命令生成一个名为person_name的新域,该域使用不带空格和 NULL 值的VARCHAR 数据类型

CREATE DOMAIN person_name AS   
 VARCHAR NOT NULL CHECK (value!~ '\s');

输出

执行上述命令后,我们将得到以下消息窗口,显示已成功为Recipients\表创建了person_name*域*

PostgreSQL 用户定义的数据类型

创建域后,我们可以使用person_name域作为First_nameLast_name列的数据类型作为一致的内置类型,如以下命令所示:

CREATE TABLE Recipients1 (  
Recipient_ID SERIAL PRIMARY KEY,  
    First_name person_name,  
    Last_name person_name,  
    Email VARCHAR NOT NULL  
    );

输出

执行上述命令后,我们将得到如下消息窗口,显示已成功创建Recipients\ 1 表。

PostgreSQL 用户定义的数据类型

笔记:

  • 创建域后,请确保两个表必须具有不同的名称,因为它采用相同的表名称 ( Recipients )。
  • PostgreSQL 引发以下错误关系“收件人”已经存在,如下面的屏幕截图所示:

PostgreSQL 用户定义的数据类型

一旦Recipients1\表已经创建成功,我们将插入使用一些值INSERT命令。

在下面的命令中,我们将一些值插入到Recipients1\表中。

INSERT INTO Recipients (First_name, Last_name, Email)  
VALUES('Mike',' W Ross','rossmike11@gmail.com');

输出

执行上述命令后,PostgreSQL为关系“recipients”违反检查约束“recipients_check”引发以下错误,因为last_name列包含空格,如下面的屏幕截图所示:

PostgreSQL 用户定义的数据类型

为了解决上述错误,我们将提供Last_name而不提供任何空格,如以下命令所示:

INSERT INTO Recipients (First_name, Last_name, Email)  
VALUES('Mike','Ross','rossmike11@gmail.com');

输出

成功执行上述命令后,我们将得到以下消息窗口,其中显示特定值已插入到Recipients\表中。

PostgreSQL 用户定义的数据类型

在 psql 中查看域

我们将按照以下过程在psql 中查看域

步骤1

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

第2步

为了连接组织数据库,我们将输入以下命令:

postgres=# \c Organization

输出

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

PostgreSQL 用户定义的数据类型

Step3

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

Organization=# \dD

输出

执行上述命令后,我们将得到以下输出,其中显示了现有域,即组织数据库中的person_name

PostgreSQL 用户定义的数据类型

删除/更改域

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

DROP DOMAIN IF EXISTS person_name;

输出

执行上述命令后,我们将收到以下错误消息:我们不能删除类型 person_name 因为其他对象依赖于它。

PostgreSQL 用户定义的数据类型

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

DROP DOMAIN IF EXISTS person_name CASCADE;

输出

执行上述命令后,我们会得到如下结果,显示person_name域已成功删除。

PostgreSQL 用户定义的数据类型

PostgreSQL CREATE TYPE 命令

PostgreSQL CREATE TYPE 命令为我们提供了一个复合类型,可以用作函数的返回类型。

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

步骤1

首先,我们将创建一个类型,例如Item_details,\我们可以在以下命令中看到:

CREATE TYPE Item_details AS (  
    item_id INT,  
    item_name VARCHAR,  
    item_price Numeric(5,2)  
);

输出

执行完上面的命令后,我们会得到如下消息窗口,说明item_details类型已经创建成功。

PostgreSQL 用户定义的数据类型

第2步

之后,我们将使用item_details数据类型作为函数的返回类型,如以下命令所示:

CREATE OR REPLACE FUNCTION get_Item_details (I_id INT)   
    RETURNS Item_details AS   
$$   
SELECT item_id, item_name,  item_price   
FROM items  
WHERE item_id = I_id ;   
$$   
LANGUAGE SQL;

输出

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

PostgreSQL 用户定义的数据类型

Step3

最后,我们将在SELECT命令的帮助下调用get_Item_details()函数:

SELECT * FROM get_Item_details(3);

输出

执行上述命令后,我们将获得以下输出,其中显示了特定的 id 项,即Audi A7

PostgreSQL 用户定义的数据类型

删除/更改类型

就像我们使用Drop domain命令删除Domain一样,我们可以使用DROP TYPE命令删除用户定义的数据类型,我们可以使用ALTER TYPE命令修改用户定义的数据类型。

DROP TYPE IF EXISTS Item_details;

输出

我们将得到与上述类似的错误(删除域),我们无法删除类型 Item_details,因为其他对象依赖于它执行上述命令。

PostgreSQL 用户定义的数据类型

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

DROP TYPE IF EXISTS Item_details CASCADE;

输出

执行完上面的命令后,我们会得到下面的消息窗口,显示指定的类型已经成功删除。

PostgreSQL 用户定义的数据类型

在 psql 中查看 TYPE

如果我们使用 psql 程序,我们可以借助以下命令列出现有数据库中的所有用户定义类型:

\dT or \dT+

例如,我们将按照以下过程在psql 中查看类型

步骤1

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

第2步

为了连接组织数据库,我们将输入以下命令:

postgres=# \c Organization

PostgreSQL 用户定义的数据类型

Step3

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

Organization=# \dT

输出

执行上述命令后,我们将得到以下输出,其中显示了现有的 TYPE,即组织数据库中的Item_details

PostgreSQL 用户定义的数据类型

Organization=# \dT+

输出

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

PostgreSQL 用户定义的数据类型

概述

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

  • PostgreSQL用户定义的数据类型被用来生成用户定义的数据类型的帮助下创建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命令来移除和删除用户定义的类型。