CREATE DOMAIN

Name

CREATE DOMAIN -- 定义一个新域

Synopsis

CREATE DOMAIN name [ AS ] data_type
    [ DEFAULT expression ]
    [ constraint [ ... ] ]

where constraint is:

[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expression) }

描述

CREATE DOMAIN创建一个新的数据域。域在本质上是一个 带有可选约束的数据类型(限制允许的取值范围)。定义域的用户成为其所有者。

如果给出一个模式名称(比如CREATE DOMAIN myschema.mydomain ...), 那么该域是在指定的模式中创建的。否则它会在当前模式中创建。域名字必需在其 所在模式中的现有类型和域中唯一。

域可以便于把不同表之间的公共域抽取到一个固定位置进行维护。比如, 一个电子邮件地址字段可能在多个表中使用,所有的都是同样的属性。 可以定义并使用一个域,而不是分别设置每个表的约束。

参数

name

要创建的域名字(可以有模式修饰)

data_type

域的下层数据类型。它可以包含数组说明符。

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, DROP DOMAIN