领域 是一个用户自定义数据类型,基于另一个基础类型。它可以选择具有约束,将其有效值限制为基础类型允许的子集。否则,它的行为与基础类型类似——例如,适用于基础类型的任何操作符或函数,都适用于领域类型。基础类型可以是任何内置或用户自定义基本类型、枚举类型、数组类型、复合类型、范围类型或另一个领域。
例如,我们可以创建一个对于整数的只接受正整数的领域
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
当将 underlying 类型的运算符或函数应用于 domain 值时,该 domain 会自动向下转换为 underlying 类型。因此,例如 mytable.id - 1
的结果被视为 integer
类型,而非 posint
。我们可以编写 (mytable.id - 1)::posint
,以将结果重新转换回 posint
,从而重新检查 domain 的约束。在这种情况下,如果已将该表达式应用于 id
值 1,则将导致错误。允许将 underlying 类型的值分配给 domain 类型的字段或变量,而无需编写显式转换,但会检查 domain 的约束。
有关详细信息,请参阅 CREATE DOMAIN。