Postgresql 中文操作指南

8.18. Domain Types #

_domain_是基于另一种 _underlying type_的用户定义数据类型。它可以选择具有约束,将有效值限制为底层类型允许的一组子集。否则,它的行为与底层类型类似 - 例如,可以应用于底层类型的任何运算符或函数都适用于域类型。底层类型可以是任何内置或用户定义的基本类型、枚举类型、数组类型、复合类型、区间类型或另一个域。

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

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 - 1 的结果被视为 integer 类型的,而不是 posint 类型的。我们可以编写 (mytable.id - 1)::posint 来将结果转换回 posint,使域的约束得以重新检查。在这种情况下,如果表达式被应用于 1 值的 id,就会产生错误。允许将基础类型的某个值分配给域类型的某个字段或变量,而无需编写显式转换,但会检查域的约束。

有关更多信息,请参阅 CREATE DOMAIN