Skip to content

8.18. 域类型#

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

例如,我们可以创建一个只接受正整数的整数域

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