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表中。
热门文章
优秀文章