【PostgreSQL】从零开始:(三十三)数据类型-域类型

2023-12-27 06:41:15

域类型(Domain Types)

在计算机科学中,域类型是用来描述一组值的集合。域类型包括整数、浮点数、布尔值、字符和字符串等基本类型,以及自定义的复合类型,如结构体、类和枚举等。

域类型可以具有不同的约束条件,例如整数类型可以有取值范围的限制,字符类型可以有特定的字符集,枚举类型可以有预定义的取值列表。

域类型在编程语言中起到了很重要的作用,它定义了变量和函数的类型,并决定了它们可以进行的操作和运算。不同的编程语言有不同的域类型系统,但大多数编程语言都支持基本的类型和一些常见的复合类型。

PostgreSQL域类型

域是基于另一种基础类型的用户定义的数据类型。(可选)它可以具有约束,将其有效值限制为基础类型允许的子集。否则,它的行为类似于基础类型,例如,任何可应用于基础类型的运算符或函数都将在域类型上工作。基础类型可以是任何内置或用户定义的基类型、枚举类型、数组类型、复合类型、范围类型或其他域。

例如,我们可以在整数上创建一个域,该域仅接受正整数:

CREATE DOMAIN posint AS integer CHECK (VALUE > 0);
CREATE TABLE mytable (id posint);
INSERT INTO mytable VALUES(1);   -- works
INSERT INTO mytable VALUES(-1);  -- fails

当基础类型的运算符或函数应用于域值时,域会自动向下转换为基础类型。因此,例如mytable.id - 1integerposint(mytable.id - 1)::posintposintid,结果被认为是 not 的类型。我们可以写信将结果转换回 ,从而重新检查域的约束。在这种情况下,如果表达式已应用于值 1,则会导致错误。允许将基础类型的值分配给域类型的字段或变量,而无需编写显式强制转换,但将检查域的约束。

在PostgreSQL中,域类型(Domain Types)允许您创建自定义数据类型,可用于表定义。域类型在您想要强制执行某些约束或为数据添加附加功能时非常有用。

在PostgreSQL中创建域类型时,可以使用以下语法:

CREATE DOMAIN [domain_name] AS [base_type]
  [constraint1]
  [constraint2]
  ...

在这里,[domain_name]是域类型的名称,[base_type]是域类型基于的基本数据类型。您还可以为域类型指定任意数量的约束。

例如,假设您想创建一个名为email的域类型来存储电子邮件地址。您可以定义如下:

CREATE DOMAIN email AS text
  CHECK (value ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$')

在这个示例中,email域类型基于text数据类型,并包含一个约束来验证值是否为有效的电子邮件地址,使用了一个正则表达式进行验证。

创建了域类型后,您可以像任何其他数据类型一样在表定义中使用它。例如:

CREATE TABLE users (
  id serial PRIMARY KEY,
  email email
);

在这个示例中,users表中的email列的类型是email,这是一个域类型,它强制执行电子邮件地址的约束。

PostgreSQL中的域类型提供了一种定义具有特定约束的自定义数据类型的方法,可以使数据库模式更加表达性,并强制执行数据完整性。

文章来源:https://blog.csdn.net/sinat_36528886/article/details/135219125
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。