2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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

描述

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

SET/DROP DEFAULT

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

SET/DROP NOT NULL

这些形式更改域是否被标记为允许 NULL 值或拒绝 NULL 值。您只能在使用该域的列不包含任何 NULL 值时 SET NOT NULL

ADD domain_constraint [ NOT VALID ]

此形式使用与 CREATE DOMAIN 相同的语法向域添加新的约束。当向域添加新的约束时,将对使用该域的所有列检查新的约束。可以通过使用 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

提交更正

如果您在文档中发现任何不正确的内容,不符合您对特定功能的体验或需要进一步说明,请使用 此表格 报告文档问题。