ALTER DOMAIN — 更改域的定义
ALTER DOMAINname
{ SET DEFAULTexpression
| DROP DEFAULT } ALTER DOMAINname
{ SET | DROP } NOT NULL ALTER DOMAINname
ADDdomain_constraint
[ NOT VALID ] ALTER DOMAINname
DROP CONSTRAINT [ IF EXISTS ]constraint_name
[ RESTRICT | CASCADE ] ALTER DOMAINname
RENAME CONSTRAINTconstraint_name
TOnew_constraint_name
ALTER DOMAINname
VALIDATE CONSTRAINTconstraint_name
ALTER DOMAINname
OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER DOMAINname
RENAME TOnew_name
ALTER DOMAINname
SET SCHEMAnew_schema
wheredomain_constraint
is: [ CONSTRAINTconstraint_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 CONSTRAINT
、ALTER DOMAIN VALIDATE CONSTRAINT
和 ALTER 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标准,但 OWNER
、RENAME
、SET SCHEMA
和 VALIDATE CONSTRAINT
变体除外,它们是 PostgreSQL 扩展。ADD CONSTRAINT
变体的 NOT VALID
子句也是 PostgreSQL 扩展。
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。