CREATE DOMAIN

CREATE DOMAIN

定义一个新域。

概要

CREATE DOMAIN name [AS] data_type [DEFAULT expression]
        [ COLLATE collation ]
        [ CONSTRAINT constraint_name
        | NOT NULL | NULL
        | CHECK (expression) [...]]

描述

CREATE DOMAIN创建一个新域。 域本质上是具有可选约束(对允许的值集的约束)的数据类型。 定义域的用户将成为其所有者。 域名在其模式中存在的数据类型和域之间必须唯一。

如果提供了模式名称(例如CREATE DOMAIN myschema.mydomain ...),则将在指定的模式中创建域。 否则,它将在当前模式中创建。

域对于将字段上的公共约束抽象到单个位置进行维护很有用。 例如,几个表可能包含电子邮件地址列,所有这些列都需要相同的CHECK约束来验证地址语法。 定义域比为每个具有电子邮件列的表设置列约束要容易得多。

为了能够创建域,您必须对基础类型具有USAGE特权。

参数

name
要创建的域的名称(可以由模式指定)。
data_type
域的基础数据类型。这可能包括数组说明符。
DEFAULT expression
为域数据类型的列指定默认值。 该值是任何无变量的表达式(但不允许子查询)。 默认表达式的数据类型必须与域的数据类型匹配。 如果未指定默认值,则默认值为空值。 默认表达式将在未为列指定值的任何插入操作中使用。 如果为特定列定义了默认值,它将覆盖与该域关联的任何默认值。 反过来,域默认值将覆盖与基础数据类型关联的任何默认值。
COLLATE collation
域的可选归类。 如果未指定排序规则,则使用基础数据类型的默认排序规则。 如果指定了COLLATE,则基础类型必须可整理。
CONSTRAINT constraint_name
约束的可选名称。如果未指定,系统将生成一个名称。
NOT NULL
通常可以防止该域的值为null。 但是,如果为该域分配了已变为空的匹配域类型仍然是可行的, 例如,通过左连接或诸如INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false))之类的命令。
NULL
该域的值允许为空。 这是默认值。 此子句仅用于与非标准SQL数据库兼容。 不建议在新应用中使用它。
CHECK(expression)
CHECK子句指定完整性约束或测试域必须满足的值。 每个约束必须是一个产生布尔结果的表达式。 它应该使用关键字VALUE来引用要测试的值。 当前,CHECK表达式不能包含子查询,也不能引用VALUE以外的变量。

示例

创建us_zip_code数据类型。 使用正则表达式测试来验证该值看起来像是有效的美国邮政编码。

CREATE DOMAIN us_zip_code AS TEXT CHECK
    ( VALUE ~ '^\d{5}$' OR VALUE ~ '^\d{5}-\d{4}$' );

兼容性

CREATE DOMAIN符合SQL标准。