CREATE DOMAIN
CREATE DOMAIN — define a new domain
大纲
CREATE DOMAINname[ AS ]data_type[ COLLATEcollation] [ DEFAULTexpression] [constraint[ ... ] ] whereconstraintis: [ CONSTRAINTconstraint_name] { NOT NULL | NULL | CHECK (expression) }
描述
CREATE DOMAIN创建一个新域。域本质上是一种带有可选约束(即对允许值集合的限制)的数据类型。定义域的用户将成为其拥有者。
如果给定了模式名(例如CREATE DOMAIN
myschema.mydomain ...),则该域会在指定模式中创建。否则它会在当前模式中创建。域名在其所在模式中的现有类型和域之间必须唯一。
域适合把字段上的常见约束抽象到单一位置进行维护。例如,若有多个表都包含电子邮件地址列,并且都需要同一个 CHECK 约束来验证地址语法,那么定义一个域会比在每个表上分别设置该约束更合适。
参数
name要创建的域名(可选地带模式限定)。
data_type该域的底层数据类型。它可以包含数组说明符。
collation该域的可选排序规则。如果未指定排序规则,则使用底层数据类型的默认排序规则。如果指定了
COLLATE,则底层类型必须是一种支持排序规则的数据类型。DEFAULTexpressionDEFAULT子句为该域数据类型的列指定默认值。该值可以是任意不含变量的表达式(但不允许子查询)。默认表达式的数据类型必须与该域的数据类型匹配。如果未指定默认值,则默认值为空值。默认表达式会在任何未为该列指定值的插入操作中使用。如果为某个特定列定义了默认值,它就会覆盖与该域关联的任何默认值。反过来,域默认值又会覆盖与底层数据类型关联的任何默认值。
CONSTRAINTconstraint_name约束的可选名称。如果未指定,系统会生成一个名称。
NOT NULL该域的值通常不允许为空值。不过,如果给该域赋一个已成为空值的匹配域类型值(例如通过左外连接,或
INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false))),带此约束的域仍可能取到空值。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 标准。