受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

ALTER DOMAIN

ALTER DOMAIN — 更改一个域的定义

Synopsis

ALTER DOMAIN name
    { SET DEFAULT expression | DROP DEFAULT }
ALTER DOMAIN name
    { SET | DROP } NOT NULL
ALTER DOMAIN name
    ADD domain_constraint [ NOT VALID ]
ALTER DOMAIN name
    DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]
ALTER DOMAIN name
     RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER DOMAIN name
    VALIDATE CONSTRAINT constraint_name
ALTER DOMAIN name
    OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER DOMAIN name
    RENAME TO new_name
ALTER DOMAIN name
    SET SCHEMA new_schema

其中 domain_constraint 是:

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

描述

ALTER DOMAIN更改一个现有域的定义。有以下几种子形式:

SET/DROP DEFAULT

这些形式为域设置或移除默认值。注意,默认值只适用于后续的 INSERT命令;它们不会影响已存在于使用该域的表中的行。

SET/DROP NOT NULL

这些形式更改域是被标记为允许 NULL 值还是拒绝 NULL 值。只有当使用该域的列中 不包含空值时,才能执行SET NOT NULL

ADD domain_constraint [ NOT VALID ]

这种形式向域中添加一个新约束。当向域添加新约束时,所有使用该域的列都会根据 新添加的约束进行检查。可以通过使用NOT VALID选项来添加新约束, 从而抑制这些检查;之后可以使用ALTER DOMAIN ... VALIDATE CONSTRAINT 验证该约束。新插入或更新的行始终都会根据所有约束进行检查,即使这些约束 被标记为NOT VALIDNOT VALID选项仅适用于 CHECK约束。

DROP CONSTRAINT [ IF EXISTS ]

这种形式删除域上的约束。如果指定了IF EXISTS而该约束不存在, 则不会抛出错误,而是发出一条提示。

RENAME CONSTRAINT

这种形式更改域上某个约束的名称。

VALIDATE CONSTRAINT

这种形式验证一个先前以NOT VALID方式添加的约束,也就是说, 它会核实该域类型的表列中的所有值都满足指定约束。

OWNER

这种形式将域的拥有者更改为指定用户。

RENAME

这种形式更改域的名称。

SET SCHEMA

这种形式更改域所在的模式。与该域关联的任何约束也会一并移动到新模式中。

要使用ALTER DOMAIN,你必须拥有该域。要更改域的模式, 你还必须在新模式上具有CREATE权限。要更改拥有者,你必须能够对 新的拥有角色执行SET ROLE,并且该角色必须在该域所在的模式上具有 CREATE权限。(这些限制确保更改拥有者不会做出任何你不能通过 删除并重新创建该域来完成的事情。不过,超级用户无论如何都可以更改任何域的所有权。)

参数

name

要修改的现有域的名称(可以是模式限定的)。

domain_constraint

该域的新约束。

constraint_name

要删除或重命名的现有约束名称。

NOT VALID

不验证现有存储的数据是否满足该约束。

CASCADE

自动删除依赖于该约束的对象,以及进一步依赖于这些对象的所有对象 (见Section 5.15)。

RESTRICT

如果存在任何依赖对象,则拒绝删除该约束。这是默认行为。

new_name

域的新名称。

new_constraint_name

约束的新名称。

new_owner

域的新拥有者的用户名。

new_schema

域的新模式。

注解

尽管ALTER DOMAIN ADD CONSTRAINT会尝试验证现有存储的数据 是否满足新约束,但这种检查并非万无一失,因为该命令无法看到那些 新插入或已更新但尚未提交的表行。如果存在并发操作可能插入不符合约束的数据的风险, 正确做法是使用NOT VALID选项添加该约束,提交该命令,等待所有在此次 提交之前启动的事务结束,然后发出ALTER DOMAIN VALIDATE CONSTRAINT来查找违反该约束的数据。这种方法是可靠的,因为一旦该约束被 提交,所有新事务都保证会对域类型的新值强制执行该约束。

目前,如果指定的域或其任何派生域被数据库中任意表的容器类型列(即复合类型列、数组列 或范围列)所使用,那么ALTER DOMAIN ADD CONSTRAINTALTER DOMAIN VALIDATE CONSTRAINTALTER DOMAIN SET NOT NULL都会失败。将来它们应当会被改进, 以便能够验证这类嵌套值上的新约束。

示例

向域添加一个NOT NULL约束:

ALTER DOMAIN zipcode SET NOT NULL;

从域中移除一个NOT NULL约束:

ALTER DOMAIN zipcode DROP NOT NULL;

向域添加一个检查约束:

ALTER DOMAIN zipcode ADD CONSTRAINT zipchk CHECK (char_length(VALUE) = 5);

从域中移除一个检查约束:

ALTER DOMAIN zipcode DROP CONSTRAINT zipchk;

重命名域上的一个检查约束:

ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check;

将域移动到另一个模式中:

ALTER DOMAIN zipcode SET SCHEMA customers;

兼容性

ALTER DOMAIN符合SQL标准,但 OWNERRENAMESET SCHEMAVALIDATE CONSTRAINT 这些变体是PostgreSQL扩展; ADD CONSTRAINT变体中的NOT VALID子句也 是PostgreSQL扩展。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。