支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

ALTER DOMAIN

ALTER DOMAIN — 更改域的定义

概要

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

where domain_constraint is:

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

描述

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

SET/DROP DEFAULT

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

SET/DROP NOT NULL

这些形式更改域是否标记为允许 NULL 值或拒绝 NULL 值。 只有当使用该域的列不包含 null 值时,才能 SET NOT NULL

ADD domain_constraint [ NOT VALID ]

此形式向域添加新约束。当向域添加新约束时,将针对新添加的约束检查使用该域的所有列。 可以通过使用 NOT VALID 选项添加新约束来抑制这些检查; 稍后可以使用 ALTER DOMAIN ... VALIDATE CONSTRAINT 使约束有效。 新插入或更新的行始终会针对所有约束进行检查,即使是标记为 NOT VALID 的约束。NOT 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

自动删除依赖于该约束的对象,以及依次依赖于这些对象的所有对象(请参见第 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 扩展。

另请参阅

CREATE DOMAINDROP DOMAIN

提交更正

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