8.18. 域类型

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

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

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,从而重新检查域的约束。在这种情况下,如果将表达式应用于id值 1,则将导致错误。允许在不编写显式强制转换的情况下,将基础类型的值分配给域类型的字段或变量,但是域的约束将被检查。

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