选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.4 已于 2020 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

CREATE DOMAIN

CREATE DOMAIN — 定义一个新域

大纲

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

其中 constraint 为:

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

描述

CREATE DOMAIN创建一个新域。域本质上是一种带有可选 约束(即对允许值集合的限制)的数据类型。定义域的用户将成为其拥有者。

如果给定了模式名(例如CREATE DOMAIN myschema.mydomain ...),则该域会在指定模式中创建。否则它会 在当前模式中创建。域名在其所在模式中的现有类型和域之间必须唯一。

域适合把字段上的常见约束抽象到单一位置进行维护。例如,若有多个表都 包含电子邮件地址列,并且都需要同一个 CHECK 约束来验证地址语法, 那么定义一个域会比在每个表上分别设置该约束更合适。

要创建域,你必须对其底层类型拥有USAGE权限。

参数

name

要创建的域名(可选地带模式限定)。

data_type

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

collation

该域的可选排序规则。如果未指定排序规则,则使用底层数据类型的默认排序规则。如果指定了COLLATE,则底层 类型必须是一种支持排序规则的数据类型。

DEFAULT expression

DEFAULT子句为该域数据类型的列指定默认值。 该值可以是任意不含变量的表达式(但不允许子查询)。默认表达式的 数据类型必须与该域的数据类型匹配。如果未指定默认值,则默认值为 空值。

默认表达式会在任何未为该列指定值的插入操作中使用。如果为某个 特定列定义了默认值,它就会覆盖与该域关联的任何默认值。反过来, 域默认值又会覆盖与底层数据类型关联的任何默认值。

CONSTRAINT constraint_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 标准。

PostgreSQL假定CHECK 约束的条件是不可变的,也就是说,对于相同的输入值,它们总会给出相同 的结果。正是基于这一假设,系统只会在值首次被转换为域类型时检查 CHECK约束,而不会在其他时候检查。(这与表 CHECK约束的处理方式基本相同,如第 5.3.1 节所述。)

一个常见的破坏此假设的方式是,在 CHECK 表达式中引用用户定义的函数,然后更改该函数的行为。PostgreSQL 不禁止此类操作,但它不会察觉到存储的域类型值现在违反了 CHECK 约束。这将导致后续的数据库转储和重新加载失败。处理此类更改的推荐方法是先删除约束(使用 ALTER DOMAIN),调整函数定义,然后重新添加约束,从而对存储的数据重新进行检查。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。