Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 命令;它们不影响已使用域的表中的行。

设置/删除非空

这些形式更改域是否标记为允许 NULL 值或拒绝 NULL 值。当使用域的列不包含空值时,您只能设置非空

添加 domain_constraint [ NOT VALID ]

此形式向域添加新的约束。向域添加新的约束时,将针对新添加的约束检查使用该域的所有列。可以使用 NOT VALID 选项来抑制这些检查;稍后可以使用 更改域...验证约束使约束有效。新插入或更新的行总是针对所有约束进行检查,即使是标记为 NOT VALID 约束也是如此。NOT VALID 仅接受 CHECK 约束。

删除约束 [ IF EXISTS ]

此形式删除域上的约束。如果指定 IF EXISTS 且约束不存在,则不会抛出错误。在这种情况下,将发出通知。

重命名约束

此形式更改域上约束的名称。

验证约束

此形式验证先前添加为 NOT VALID 的约束,即它验证域类型表列中的所有值是否满足指定约束。

所有者

此形式将域的所有者更改为指定的使用者。

重命名

此形式更改域的名称。

设置模式

此形式更改域的模式。与域关联的任何约束也会移到新的模式中。

您必须拥有域才能使用 更改域。若要更改域的模式,您还必须在新模式上拥有 创建 权限。若要更改所有者,您必须能够将 设置角色 设置为新的拥有角色,并且该角色必须对域的模式有 创建 权限。(这些限制确保更改所有者不会做任何您无法通过删除并重新创建域来完成的事情。但是,超级用户无论如何都可以更改任何域的所有权。)

参数

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