CREATE DOMAIN
CREATE DOMAIN¶
定义一个新域。
- 语法
sql 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
权限。 - 参数
-
该SQL命令参数说明见下
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标准。- 相关SQL命令
ALTER DOMAIN
,DROP DOMAIN