在PostgreSQL中,域(Domain)是一种用户定义的数据类型,它基于系统内已存在的数据类型,并可以附加约束条件。使用域可以增强数据的完整性和一致性,因为它允许开发者对特定列设定更为具体的规则,比如指定默认值、限制取值范围或格式。这有助于确保数据库表中的数据符合业务逻辑要求,减少错误和不一致的数据输入,从而提高数据质量。简而言之,域提供了一种封装数据类型及其约束的有效方式,使得这些规则可以在多个表中重用,简化了数据库设计和维护工作。
对Domain的理解
Postgresql中的Domain是指在定义表列时,可以定义一组具有相同性质的值,根据Domain定义的表列只能用其定义的值,将该列所需要的值集合为一个统一的值域,可以用于限制值的类型。
使用Domain的主要优点是它可以为每个列设置不同类型的限制,为每个列都创建相同的限制,同时可用于多个表的多个列,以提高可重用性,并减少编码时间。
使用Domain的缺点是它有一定的灵活性,但在建立Domain之前用户必须清楚地定义每个Domain,因此有可能造成一定程度上的冗余。
Domain的功能
数据类型封装
Domain可以将一个或多个现有的数据类型封装成一个新的数据类型。这样可以提高代码的可读性和可维护性,同时也可以减少错误的发生。
数据约束
Domain可以定义一组约束条件,用于限制数据的取值范围。例如,可以定义一个Domain来限制某个列的取值只能是特定的枚举值,或者限制某个列的取值范围在一定的数值范围内。
数据验证
Domain可以定义一组验证规则,用于验证数据的有效性。例如,可以定义一个Domain来验证某个列的值是否符合特定的正则表达式,或者验证某个列的值是否满足一定的业务逻辑。
数据转换
Domain可以定义一组转换规则,用于在存储和检索数据时进行数据转换。例如,可以定义一个Domain来将某个列的值从一种数据类型转换为另一种数据类型,或者将某个列的值进行格式化。
Domain的常用操作
创建Domain
create domain s_string100 as VARCHAR(100);
删除Domain
drop domain if exists s_string100 ;
查看创建的Domain
SELECT oid, typname FROM pg_type WHERE typtype = 'd';
Domain的使用示例
创建邮箱校验Domain
CREATE DOMAIN email_domain AS varchar(255)
CHECK (VALUE ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
在表中关联使用Domain
CREATE TABLE users (
id serial PRIMARY KEY,
name varchar(100) NOT NULL,
email email_domain UNIQUE
);
小贴士: Domain不仅可以简化字段类型声明,还能在多个表中统一应用相同的约束,便于维护和确保数据质量