🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# CREATE DOMAIN ## Name CREATE DOMAIN -- 定义一个新域 ## Synopsis ``` CREATE DOMAIN _name_ [ AS ] _data_type_ [ COLLATE _collation_ ] [ DEFAULT _expression_ ] [ _constraint_ [ ... ] ] where `_constraint_` is: [ CONSTRAINT _constraint_name_ ] { NOT NULL | NULL | CHECK (_expression_) } ``` ## 描述 `CREATE DOMAIN`创建一个新的数据域。 域在本质上是一个带有可选约束的数据类型(限制允许的取值范围)。定义域的用户成为其所有者。 如果给出一个模式名称(比如`CREATE DOMAIN myschema.mydomain ...`), 那么该域是在指定的模式中创建的。 否则它会在当前模式中创建。域名字必需在其所在模式中的现有类型和域中唯一。 域可以便于把不同表之间的公共约束提取到一个固定位置进行维护。 比如,在多个表中都含有一个电子邮件地址字段,这个字段都要求有CHECK的约束检查来验证邮箱的有效性。 此时可以定义并使用一个域,而不是分别设置每个表的约束。 要创建域,你必须有相关数据类型的`USAGE`权限。 ## 参数 `_name_` 要创建的域名字(可以有模式修饰) 。 `_data_type_` 域的下层数据类型。这时可以包含一组的定义选项。 `_collation_` 可选的域的排序规则。如果没有指定排序规则,会使用下层所属数据类型的排序规则。 如果使用了`COLLATE`选项,则下层数据类型必须是可排序的。 `DEFAULT` `_expression_` `DEFAULT`选项为域数据类型的字段声明一个缺省值。 该值是任何不含变量的表达式(但不允许子查询)。 缺省表达式的数据类型必需匹配域的数据类型。 如果没有声明缺省值,那么缺省值就是 NULL 。 缺省表达式将用于任何省略该字段值的插入操作。 如果为特定的字段声明了缺省值, 那么它覆盖任何和该域相关联的缺省值。 然后,域的缺省覆盖任何与下层数据类型相关的缺省。 `CONSTRAINT` `_constraint_name_` 一个约束的可选名称。如果没有声明,系统将自动生成一个名字。 `NOT NULL` 域的值通常不能为空。 然而,对于有此约束的域,若分配了匹配的空域类型,则仍然可能会有空值, 例如:通过一个LEFT OUTER JOIN或者`INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false))`。 `NULL` 这个域的数值允许为 NULL 。这是缺省。 这个子句只是用于和非标准的 SQL 数据库兼容用。不建议在新的应用中使用它。 `CHECK (``_expression_`) `CHECK`选项声明域的数值必须满足的完整性约束或测试。 每个约束必须是一个生成布尔结果的表达式。它应该使用关键字`VALUE`来引用被测试的数值。 目前,`CHECK`表达式不能包含子查询,也不能引用除 VALUE之外的变量。 ## 例子 这个例子创建了`us_postal_code`数据类型并且在一个表定义中 使用了该类型。 使用了一个正则表达式测试以保证这些数值看起来像一个美国的邮政编码: ``` CREATE DOMAIN us_postal_code AS TEXT CHECK( VALUE ~ '^\d{5}$' OR VALUE ~ '^\d{5}-\d{4}$' ); CREATE TABLE us_snail_addy ( address_id SERIAL PRIMARY KEY, street1 TEXT NOT NULL, street2 TEXT, street3 TEXT, city TEXT NOT NULL, postal us_postal_code NOT NULL ); ``` ## 兼容性 `CREATE DOMAIN`命令符合SQL标准。 ## 参见 [ALTER DOMAIN](#calibre_link-568), [DROP DOMAIN](#calibre_link-566)