PostgreSQL 自定义数据类型

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

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

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

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

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

PostgreSQL 创建域命令

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

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

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

域数据类型示例

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

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

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

Recipients表包含以下列,例如Recipient_id、First_name、Last_name 和 Email。

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数据库中。

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

所以,这里我们可以创建如person_name 的域,并在各个列中复用它来定义 CHECK 约束。

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

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

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

创建域后,我们可以使用person_name域作为First_name和Last_name列的数据类型作为一致的内置类型,如我们在以下命令中看到的:

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

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

注意:

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

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

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

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

 执行上述命令后,PostgreSQL 引发以下错误new row for relation "recipients" violates check constraint "recipients_check" because the last_name column contains the space as shown in the below screenshot:

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

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

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

热门文章

优秀文章